尝试在 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}
如何解决发展数据库模式的问题?
经过一番谷歌搜索后,我发现了类似的问题如何使用 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;
我在创建下一个程序时遇到了同样的问题
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;