簡體   English   中英

在 Postgres 觸發器創建中出錯

[英]Getting error in Postgres trigger creation

我正在嘗試在我的 PostgresSql 環境中創建此觸發器:

CREATE TRIGGER MYTRIGGER
BEFORE INSERT
ON MYTABLE
FOR EACH ROW
BEGIN
  IF( LENGTH( :NEW.VAL ) > 10 )
  THEN
    RAISE_APPLICATION_ERROR( -20003, 
                             'Cannot exceed 10 chars' );
  END IF;

  IF :NEW.FQN_ID IS NULL THEN
  :NEW.FQN_ID :=
      CASE :NEW.SUBTYPECODE
        WHEN NULL  THEN 'A:'
        WHEN 0     THEN 'B:'
        WHEN 1     THEN 'C:'
        WHEN 2     THEN 'D:'
      ELSE 'Z:' || :NEW.SUBTYPECODE || '::'
      --END || :NEW.OBJECTID;
      END || STRUCTURE_FQNID_SEQ.NEXTVAL;
 END IF;
END;

但我得到這個錯誤:

 ERROR: syntax error at or near "BEGIN" LINE 5: BEGIN ^ SQL state: 42601 Character: 79

我想我錯過了一些東西,但我無法得到它。

任何建議將不勝感激。

謝謝你。

以下是我對幾個 DBMS 中觸發器的說明: https://github.com/iwis/SQL-notes 我用橙色標記了 DBMS 之間的差異。 我認為注釋已經很完整了,因此您不必閱讀 Postgres 文檔中有關觸發器的內容。

我看到您的示例中需要進行以下更改:

  • 將 Oracle :NEW更改為 Postgres NEW
  • 而不是BEGIN... END塊,寫EXECUTE FUNCTION my_trigger_function(); ,其中my_trigger_function是一個 function,需要像 a_horse_with_no_name 給出的示例一樣創建。 這個 function 在您的情況下應該返回NEW - 原因 在此處描述。

如果觸發器觸發了更復雜的代碼,那么您還需要了解 PL/SQL 和 PL/pgSQL 語言之間的區別。 這些語言非常相似,盡管存在一些差異。 您的代碼很簡單,因此差異很小。 這可能就足夠了:

  • 在 function 定義中寫入 Postgres RETURNS而不是 Oracle RETURN
  • BEGIN之前寫$$$$ LANGUAGE plpgsql; END之后。
  • 寫 Postgres RAISE 'Cannot exceed 10 chars'; 而不是 Oracle RAISE_APPLICATION_ERROR(-20003, 'Cannot exceed 10 chars'); .

我不知道序列在 PostgreSQL 中是否以相同的方式工作——我還沒有讀到它們。

讓我知道我的筆記是否可以理解 - 我不確定,因為它們非常緊湊,所以你需要破譯我使用的標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM