[英]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 文檔中有關觸發器的內容。
我看到您的示例中需要進行以下更改:
: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 語言之間的區別。 這些語言非常相似,盡管存在一些差異。 您的代碼很簡單,因此差異很小。 這可能就足夠了:
RETURNS
而不是 Oracle RETURN
。BEGIN
之前寫$$
和$$ LANGUAGE plpgsql;
在END
之后。RAISE 'Cannot exceed 10 chars';
而不是 Oracle RAISE_APPLICATION_ERROR(-20003, 'Cannot exceed 10 chars');
.我不知道序列在 PostgreSQL 中是否以相同的方式工作——我還沒有讀到它們。
讓我知道我的筆記是否可以理解 - 我不確定,因為它們非常緊湊,所以你需要破譯我使用的標記。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.