【问题标题】:Postgresql Syntax Error in Trigger Function触发器函数中的 Postgresql 语法错误
【发布时间】:2020-05-25 01:15:39
【问题描述】:

我想在我的 Postgresql 数据库中创建以下触发器函数:

CREATE FUNCTION attribute_edit_history() 
    RETURNS TRIGGER AS 
$BODY$   
  BEGIN
    Select 
            CASE 
            WHEN NOT EXISTS
            (SELECT * FROM public."TB02_MDD_KEY" where "ENCODED_ID" =ENCODE(CONVERT_TO(NEW."ATTRIBUTE_NAME", 'UTF-8'), 'base64'))
            THEN 
             CASE
             WHEN OLD."ATTRIBUTE_NAME" is distinct from NEW."ATTRIBUTE_NAME"
                THEN
                     INSERT INTO public."TB08_ATTRIBUTE_EDIT_HISTORY"(
                     "ENCODED_ID_OLD","ENCODED_ID_NEW" , "VERSION", "ATTRIBUTE_OLD", "ATTRIBUTE_NEW", "ATTRIBUTE_NEW_ID")
                     VALUES ( OLD."ENCODED_ID", NEW."ENCODED_ID", NEW."VERSION", OLD."ATTRIBUTE_NAME", NEW."ATTRIBUTE_NAME", ENCODE(CONVERT_TO(NEW."ATTRIBUTE_NAME", 'UTF-8'), 'base64')); 
                END;
             END;

    RETURN NEW;

  END;

$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER "attribute_edit_history" BEFORE UPDATE ON "TB02_MDD_KEY"
  FOR EACH ROW EXECUTE PROCEDURE attribute_edit_history();

我收到以下语法错误:

ERROR:  syntax error at or near "INTO"
LINE 13:       INSERT INTO public."TB08_ATTRIBUTE_EDIT_HISTORY"(
                      ^
SQL state: 42601
Character: 352

我不知道我哪里错了。

提前致谢!

【问题讨论】:

    标签: sql postgresql sql-update sql-insert database-trigger


    【解决方案1】:

    您很可能需要一个简单的IF 语句而不是嵌套的CASE 表达式:

    CREATE FUNCTION attribute_edit_history() 
    RETURNS TRIGGER AS 
    $BODY$   
    BEGIN
        IF 
            NOT EXISTS(
                SELECT 1 
                 FROM public.TB02_MDD_KEY 
                 WHERE ENCODED_ID = ENCODE(CONVERT_TO(NEW.ATTRIBUTE_NAME, 'UTF-8'), 'base64')
            ) 
            AND OLD.ATTRIBUTE_NAME IS DISTINCT FROM NEW.ATTRIBUTE_NAME
        THEN
            INSERT INTO public.TB08_ATTRIBUTE_EDIT_HISTORY(
                ENCODED_ID_OLD,
                ENCODED_ID_NEW , 
                VERSION, 
                ATTRIBUTE_OLD, 
                ATTRIBUTE_NEW, 
                ATTRIBUTE_NEW_ID
            ) VALUES ( 
                OLD.ENCODED_ID, 
                NEW.ENCODED_ID, 
                NEW.VERSION, 
                OLD.ATTRIBUTE_NAME, 
                NEW.ATTRIBUTE_NAME, 
                ENCODE(CONVERT_TO(NEW.ATTRIBUTE_NAME, 'UTF-8'), 'base64')
            ); 
        END IF;
        RETURN NEW;
    END;
    $BODY$
    LANGUAGE plpgsql;
    

    请注意,我删除了表和列标识符周围的双引号;你不需要那些(除非你有区分大小写的标识符,这里似乎不是这种情况)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 2020-09-06
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多