当使用ANT执行下面显示的触发代码时,我得到错误
org.postgresql.util.PsqlException: ERROR: unterminated quoted string at or near "' DECLARE timeout integer" Position: 57
我可以成功地执行下面的代码通过PGADmin(由postgres提供)和命令行实用程序“psql”,并添加了触发器功能,但是通过ANT执行时,它每次失败
BEGIN TRANSACTION; CREATE OR REPLACE FUNCTION sweeper() RETURNS trigger as ' DECLARE timeout integer; BEGIN timeout = 30 * 24 * 60 * 60 ; DELETE FROM diagnosticdata WHERE current_timestamp - teststarttime > (timeout * ''1 sec''::interval); return NEW; END; ' LANGUAGE 'plpgsql'; -- Trigger: sweep on diagnosticdata CREATE TRIGGER sweep AFTER INSERT ON diagnosticdata FOR EACH ROW EXECUTE PROCEDURE sweeper(); END;
我有与Liquibase使用的JDBC驱动程序相同的问题。
看起来驱动程序以分号结尾的每行都会以单独的sql命令运行。这就是为什么下面的代码将由JDBC驱动程序按以下顺序执行:
> CREATE OR REPLACE FUNCTION test(text)返回无效为’DECLARE tmp text
> BEGIN tmp:=“test”
> END;
>’LANGUAGE plpgsql
unterminated dollar-quoted string at or near ' DECLARE tmp text
要纠正这一点,您需要在每行结束后使用反斜杠分号:
CREATE OR REPLACE FUNCTION test(text) RETURNS void AS ' DECLARE tmp text; \ BEGIN tmp := "test"; \ END;' LANGUAGE plpgsql;
或者,您可以将整个定义放在一行中。