我想通过播放框架演化脚本为Postgres DB创建以下触发器,如果我在sql ID-e工具中运行它可以正常但是当我尝试通过播放应用程序中的evolution / migration脚本运行它时它返回一个错误:
CREATE OR REPLACE FUNCTION mark_processed()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.status <> OLD.status and NEW.status = 'FT' THEN
update "match" set processed = true;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER on_fultime_trigger
AFTER UPDATE
ON "match"
FOR EACH ROW
EXECUTE PROCEDURE mark_processed();
错误:
e出现以下错误:错误:未终止的美元引用字符串at 或者附近&#34; $ BODY $ BEGIN如果NEW.status&lt;&gt; OLD.status和NEW.status = &#39; FT&#39;然后更新&#34;匹配&#34; set processed = true&#34;位置:64 [错误:0, SQLSTATE:42601],在尝试运行此SQL脚本时:
堆栈跟踪:
[error] 2018-02-18 21:38:07,365 o.j.StatementLogger - java.sql.Statement.execute: CREATE OR REPLACE FUNCTION mark_processed()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.status <> OLD.status and NEW.status = 'FT' THEN
update "match" set processed = true;
throws exception: org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted string at or near "$BODY$
BEGIN
IF NEW.status <> OLD.status and NEW.status = 'FT' THEN
update "match" set processed = true"
Position: 64
org.postgresql.util.PSQLException: ERROR: unterminated dollar-quoted string at or near "$BODY$
BEGIN
IF NEW.status <> OLD.status and NEW.status = 'FT' THEN
update "match" set processed = true"
Position: 64
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:443)
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95)
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] 2018-02-18 21:38:07,365 o.j.StatementLogger - java.sql.Statement.execute: CREATE OR REPLA
答案 0 :(得分:0)
这是游戏进化的错误。你必须加倍所有“;”......
所以你的代码是:
CREATE OR REPLACE FUNCTION mark_processed()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.status <> OLD.status and NEW.status = 'FT' THEN
update "match" set processed = true;;
END IF;;
RETURN NEW;;
END;;
$BODY$
LANGUAGE plpgsql;;
CREATE TRIGGER on_fultime_trigger
AFTER UPDATE
ON "match"
FOR EACH ROW
EXECUTE PROCEDURE mark_processed();;