2013-10-09 33 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));