尝试在在线建模资源https://www.db-fiddle.com/上创建触发器时
CREATE OR REPLACE FUNCTION update_datem()
RETURNS trigger AS
$$
BEGIN
NEW.dateM = DATE_TRUNC('MONTH', NEW.date);
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER markk_bi
BEFORE INSERT OR UPDATE
ON markk
FOR EACH ROW
EXECUTE PROCEDURE update_datem();
抛出错误:
Schema Error: error: unterminated dollar-quoted string at or near "$$ BEGIN NEW.dateM = DATE_TRUNC('MONTH', NEW.date);"
Schema Error: error: syntax error at or near "RETURN"
Schema Error: error: unterminated dollar-quoted string at or near "$$ LANGUAGE plpgsql;"
Schema Error: error: function update_datem() does not exist
如何避免?
PS 熬夜不好。所以我改为$爬进这个问题@。事实上,问题正是一些数据库客户端,包括在 db-fiddle 上使用的客户端,忽略了什么$$
旧版本的问题
CREATE OR REPLACE FUNCTION update_datem()
RETURNS trigger AS
@BODY@
BEGIN
NEW.dateM = DATE_TRUNC('MONTH', NEW.date);
RETURN NEW;
END;
@BODY@
LANGUAGE plpgsql;
CREATE TRIGGER markk_bi
BEFORE INSERT OR UPDATE
ON markk
FOR EACH ROW
EXECUTE PROCEDURE update_datem();
抛出错误:
Schema Error: error: syntax error at or near "@"
Schema Error: error: syntax error at or near "RETURN"
Schema Error: error: function update_datem() does not exist
问题是这个建模环境,甚至一些使用 PostgreSQL 数据库的客户端,不理解
$$和$$(或$BODY$和$BODY$)之间包含的所有内容实际上都是文本,应该作为一个单独的块传输到服务器,而不是碎片$$或$BODY$。解决方案,至少适用于 db-fiddle,但很可能适用于任何地方,是替换
$$or$BODY$with',同时不要忘记在内部各处使用双引号:这是一个例子:db-fiddle
在 PostgreSQL 中,函数(和触发器)的文本必须作为字符串传递。
@PostgreSQL中没有字符的字符串字面量语法。所以这是一个明显的语法错误。PostgreSQL 有一个语法Dollar-quoted String很可能你是认真的。