【问题标题】:Unable to execute create postgres function in Play framework evolutions无法在 Play 框架演变中执行创建 postgres 功能
【发布时间】:2018-07-29 02:39:26
【问题描述】:

我想通过 play framework 进化脚本为 Postgres DB 创建以下触发器,如果​​我在 sql ID-e 工具中运行它,它可以正常工作,但是当我尝试通过 play 应用程序中的进化/迁移脚本运行它时它返回一个错误:

 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 收到以下错误:错误:未终止的美元引号字符串 或在“$BODY$ BEGIN IF NEW.status OLD.status 和 NEW.status = 'FT' THEN update "match" set processed = true" Position: 64 [ERROR: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

【问题讨论】:

    标签: postgresql playframework playframework-evolutions


    【解决方案1】:

    这是游戏进化的错误。您必须将所有“;”加倍...
    所以你的代码是:

      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();;
    

    【讨论】:

    • 嗯,不错的赶上.... tnx for info ...会在晚上尝试,如果有效,我会接受你的回答
    • 它对我有用!谢谢... @simonC 你忘记接受这个答案了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多