我有一個包含以下列的客戶表:
CREATE TABLE customers
(
customer_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 320
PRIMARY KEY,
name VARCHAR2( 255 ) NOT NULL,
address VARCHAR2( 255 ) ,
website VARCHAR2( 255 ) ,
credit_limit NUMBER( 8, 2 ) ,
isActive VARCHAR2(20) /*values are either TRUE or FALSE(default)*/
);
這個表中已經有很多記錄,現在我想寫一個觸發器,所以當插入新的客戶行時,isActive應該默認為FALSE.
我做了這樣的事情:
CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS" BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
when (NEW.CUSTOMER_ID > 0)
BEGIN
UPDATE CUSTOMERS set NEW.ISACTIVE = 'FALSE';
dbms_output.put('updated flag: ' || new.ISACTIVE);
END;
但我收到以下錯誤:
Error: SQL statement ignored
Error: ORA-00904: NEW.ISACTIVE invalid identifier
Error: NEW.ISACTIVE must be declared
我只是想isActive在插入之前為列設定默認值,但無法成功。還想看看我是否需要添加任何其他驗證。
任何幫助表示贊賞。
uj5u.com熱心網友回復:
編輯:您不需要此任務的觸發器
ALTER TABLE CUSTOMER MODIFY isActive VARCHAR2(20) DEFAULT 'FALSE';
不要嘗試在觸發器內更新同一個表 - 你會得到一個“變異表”錯誤。只需修改偽記錄:新
CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS"
BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
BEGIN
IF :NEW.CUSTOMER_ID > 0 THEN
:NEW.ISACTIVE := 'FALSE';
END IF;
dbms_output.put('updated flag: ' || :new.ISACTIVE);
END;
如果您想使用 WHEN 子句,請記住
NEW 和 OLD 關鍵字在 WHEN 子句中指定時不被視為系結變數,因此前面沒有冒號 (:)。但是,在除 WHEN 子句之外的所有參考中,您都必須在 NEW 和 OLD 之前使用冒號。所以
CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS"
BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
WHEN (NEW.CUSTOMER_ID > 0)
BEGIN
:NEW.ISACTIVE := 'FALSE';
dbms_output.put('updated flag: ' || :new.ISACTIVE);
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/336350.html
