postgresql – 错误:未终止的带引号的字符串在或接近

前端之家收集整理的这篇文章主要介绍了postgresql – 错误:未终止的带引号的字符串在或接近前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当使用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

当然,这是无效的sql并导致以下错误

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;

或者,您可以将整个定义放在一行中。

猜你在找的Postgre SQL相关文章