2013-10-09 32 views
0
CREATE OR REPLACE RULE INSERT_part_name AS 
    ON INSERT TO partition.part_name 
    DO INSTEAD select crm.dblink_exec('crm_server'::text, 'insert into partition.part_name(customerid, partition_name, partition, createdate) values('||new.customerid||','||quote_literal(new.partition_name)||',false'::text ||','||quote_literal(new.createdate))::timestamp without time zone); 
 
ERROR: syntax error at or near ")" 
LINE 3: ...uote_literal(new.createdate))::timestamp without time zone); 
                   ^
+2

不要你看到的問題與嵌套''' ? – karthikr

+0

我的猜測是之前有一個'||'丟失。或':: timestamp without time zone'應該在它之前的引號內。順便說一句:我不喜歡在規則中放入db_link的_idea_。也許我太老套了。 – wildplasser

+0

@karthikr 我不知道我是否明白你的觀點是否正確......我編輯了上述編碼..但是我仍然收到錯誤 – Abdul

回答

0

不知道的想法,在規則中使用DBLINK(未測試)。但是,你有一個封閉)太多:

CREATE OR REPLACE RULE INSERT_part_name AS 
ON INSERT TO partition.part_name 
DO INSTEAD SELECT crm.dblink_exec('crm_server'::text, 
    'insert into partition.part_name(customerid, partition_name, partition, createdate) 
    values(' || new.customerid || ',' || quote_literal(new.partition_name) || ',false' 
    || ',' || quote_literal(new.createdate::timestamp without time zone)); 

我會用format(),不過,對於更清潔的代碼(需要Postgres的9.1+):

CREATE OR REPLACE RULE INSERT_part_name AS 
ON INSERT TO partition.part_name 
DO INSTEAD SELECT crm.dblink_exec('crm_server'::text, format(
'INSERT INTO partition.part_name(customerid, partition_name, partition, createdate) 
    VALUES(%s, %L, false, %L)' 
,NEW.customerid, NEW.partition_name, NEW.createdate::timestamp));