postgres 创建触发器函数错误:未终止的美元报价预期在数据库模式演化中终止 $$

问题描述 投票:0回答:2

尝试在 postgres 11 中创建触发器函数。

CREATE FUNCTION task_state_change_stamp() RETURNS TRIGGER AS $task_state_change_stamp$
    BEGIN
        IF NEW.task_id = OLD.task_id AND NEW.state_id != OLD.state_id THEN
        INSERT INTO workflow.review_task_audit (task_id, old_state_id, new_state_id, last_updated_ts) VALUES (NEW.task_id, OLD.state_id, NEW.state_id, now());
        END IF;
        RETURN NULL;
    END;
$task_state_change_stamp$ LANGUAGE plpgsql;

我将代码片段粘贴到连接到 postgres 的 psql 解释器中,并且可以成功创建该函数。

但是,当我将代码片段嵌入作为数据库模式演化的一部分(我正在使用 java Play 框架)时,它会抛出一个错误:

23:38:18 {"@timestamp":"2022-08-08T06:38:18.959Z","@version":"1","message":"Unterminated dollar quote started at position 61 in SQL CREATE FUNCTION task_state_change_stamp() RETURNS TRIGGER AS $task_state_change_stamp$\nBEGIN\nIF NEW.task_id = OLD.task_id AND NEW.state_id != OLD.state_id THEN\nINSERT INTO workflow.review_task_audit (task_id, old_state_id, new_state_id, last_updated_ts) VALUES (NEW.task_id, OLD.state_id, NEW.state_id, now()). Expected terminating $$ [ERROR:0, SQLSTATE:42601]","logger_name":"play.api.db.evolutions.DefaultEvolutionsApi","thread_name":"pool-1-thread-1","level":"ERROR","level_value":40000}

如何解决发展数据库模式的问题?

postgresql triggers playframework
2个回答
0
投票

经过一番谷歌搜索后,我发现了类似的问题如何使用 Play 框架中的进化在 PostgreSQL 中创建函数?

根据该答案,下面的代码片段有效。

CREATE FUNCTION task_state_change_stamp() RETURNS TRIGGER AS $$
    BEGIN
        IF NEW.task_id = OLD.task_id AND NEW.state_id != OLD.state_id THEN
        INSERT INTO workflow.review_task_audit (task_id, old_state_id, new_state_id, last_updated_ts) VALUES (NEW.task_id, OLD.state_id, NEW.state_id, now());;
        END IF;;
        RETURN NULL;;
    END;;
$$ LANGUAGE plpgsql;

0
投票

我在创建下一个程序时遇到了同样的问题

CREATE OR REPLACE PROCEDURE my_cool_procedure(
    OUT data refcursor)
LANGUAGE 'plpgsql'
AS $BODY$

BEGIN
    POSTABLE_VISITS := 'cssuser_p_get_postable_reviews';
    OPEN POSTABLE_VISITS FOR
        SELECT 8;
END;
$BODY$;

我通过替换 END 和 $BODY$ 来修复它

CREATE OR REPLACE PROCEDURE my_cool_procedure(
    OUT data refcursor)
LANGUAGE 'plpgsql'
AS $BODY$

BEGIN
    POSTABLE_VISITS := 'cssuser_p_get_postable_reviews';
    OPEN POSTABLE_VISITS FOR
        SELECT 8;
$BODY$;
END;
© www.soinside.com 2019 - 2024. All rights reserved.