Anu*_*nuj 40 ant postgresql triggers plpgsql
在使用ANT执行下面显示的触发器代码时,我收到错误
org.postgresql.util.PSQLException: ERROR: unterminated quoted string at or near "' DECLARE timeout integer"
Position: 57
Run Code Online (Sandbox Code Playgroud)
我能够通过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;
Run Code Online (Sandbox Code Playgroud)
Fri*_*oße 51
我在liquibase中遇到了这个错误,这个页面是第一个搜索结果之一,所以我想我在这个页面上分享我的解决方案:
您可以将整个sql放在单独的文件中,并将其包含在changeset中.设置splitStatements
选项很重要false
.
然后整个变更集就像
<changeSet author="fgrosse" id="530b61fec3ac9">
<sqlFile path="your_sql_file_here.sql" splitStatements="false"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
我总是喜欢在单独的文件中包含那些大的SQL部分(比如函数更新等).这样,您在打开sql文件时可以获得正确的语法突出显示,而不必在一个文件中混合使用XML和SQL.
编辑:正如评论中所提到的,值得注意的是,sql
更改也支持该splitStatements
选项(对于指出这一点而言,这是对于AndreyT).
man*_*nRo 27
我对Liquibase使用的JDBC驱动程序有同样的问题.
似乎驱动程序以分号结束每个行,并将其作为单独的SQL命令运行.这就是为什么下面的代码将由JDBC驱动程序按以下顺序执行:
CREATE OR REPLACE FUNCTION test(text) RETURNS VOID AS ' DECLARE tmp text
BEGIN tmp := "test"
END;
' LANGUAGE plpgsql
当然,这是无效的SQL并导致以下错误:
unterminated dollar-quoted string at or near ' DECLARE tmp text
Run Code Online (Sandbox Code Playgroud)
要更正此问题,您需要在每行以分号结束后使用反斜杠:
CREATE OR REPLACE FUNCTION test(text)
RETURNS void AS ' DECLARE tmp text; \
BEGIN
tmp := "test"; \
END;' LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
或者,您可以将整个定义放在一行中.
小智 5
我正在使用HeidiSQL客户端,可以通过在CREATE OR REPLACE语句之前放置DELIMITER //来解决。HeidiSQL中还有一个“一次性发送批处理”选项,基本上可以实现相同的目的。