【问题标题】:Cannot insert NULL into, ERROR during execution of trigger无法插入 NULL,触发器执行期间出现错误
【发布时间】:2017-10-21 20:26:52
【问题描述】:

我在表 Customers 上创建了一个触发器,以便每次从表 customers 中删除一条记录时,都会将同一条记录插入到表 Customer_Archives 中,当前日期为 Deletion_Date。

我必须在表 Customers 中插入一个新客户,然后将其删除。记录必须正确插入到表 Customers_Archive 中。

这是我目前的脚本:

CREATE TABLE Customer_Archives
(
  customer_id           NUMBER          NOT NULL,
  customer_first_name   VARCHAR2(50),
  customer_last_name    VARCHAR2(50)    NOT NULL,
  customer_address      VARCHAR2(255)   NOT NULL,
  customer_city         VARCHAR2(50)    NOT NULL,
  customer_state        CHAR(2)         NOT NULL,
  customer_zip          VARCHAR2(20)    NOT NULL,
  customer_phone        VARCHAR2(30)    NOT NULL,
  customer_fax          VARCHAR2(30),
  deletion_date         DATE, 
  CONSTRAINT customer_archives_pk 
    PRIMARY KEY (customer_id)
);

CREATE OR REPLACE TRIGGER Customers_before_insert
BEFORE DELETE ON Customers
FOR EACH ROW 
DECLARE 
    ar_row Customers%rowtype;
BEGIN
INSERT INTO Customer_Archives 
VALUES(ar_row.Customer_id,
    ar_row.Customer_First_Name,
    ar_row.Customer_Last_Name,
    ar_row.Customer_Address,
    ar_row.Customer_City,
    ar_row.Customer_State,
    ar_row.Customer_Zip,
    ar_row.Customer_Phone,
    ar_row.Customer_Fax, 
    sysdate());
    dbms_output.put_line('New row is added to Customers_Archive 
    Table with Customer_ID:' ||ar_row.Customer_id ||'on date:' || sysdate());
END;
/

SELECT trigger_name, status FROM user_triggers;

INSERT INTO CUSTOMERS
(customer_id, customer_first_name, customer_last_name, customer_address, 
customer_city, customer_state, customer_zip, customer_phone, customer_fax)
VALUES (27,'Sofia','Chen','8888 Cowden St.','Philadelphia','PA',
'19149',7654321234',NULL);

DELETE FROM CUSTOMERS
WHERE customer_id = 27;

当我尝试删除我刚刚插入的客户时,我收到一个错误:

Error starting at line : 47 in command -
DELETE FROM CUSTOMERS
WHERE customer_id = 27
Error report -
ORA-01400: cannot insert NULL into ("TUG81959"."CUSTOMER_ARCHIVES"."CUSTOMER_ID")
ORA-06512: at "TUG81959.CUSTOMERS_BEFORE_INSERT", line 4
ORA-04088: error during execution of trigger 'TUG81959.CUSTOMERS_BEFORE_INSERT'

【问题讨论】:

    标签: oracle plsql ddl database-trigger


    【解决方案1】:

    在您的 DELETE 触发器中,您应该在创建存档记录时使用 :OLD 值:

    CREATE OR REPLACE TRIGGER CUSTOMERS_BEFORE_INSERT
      BEFORE DELETE ON CUSTOMERS
      FOR EACH ROW 
    BEGIN
      INSERT INTO CUSTOMER_ARCHIVES 
        (CUSTOMER_ID,
         CUSTOMER_FIRST_NAME,
         CUSTOMER_LAST_NAME,
         CUSTOMER_ADDRESS,
         CUSTOMER_CITY,
         CUSTOMER_STATE,
         CUSTOMER_ZIP,
         CUSTOMER_PHONE,
         CUSTOMER_FAX,
         DELETION_DATE)
      VALUES
        (:OLD.CUSTOMER_ID,
         :OLD.CUSTOMER_FIRST_NAME,
         :OLD.CUSTOMER_LAST_NAME,
         :OLD.CUSTOMER_ADDRESS,
         :OLD.CUSTOMER_CITY,
         :OLD.CUSTOMER_STATE,
         :OLD.CUSTOMER_ZIP,
         :OLD.CUSTOMER_PHONE,
         :OLD.CUSTOMER_FAX, 
         SYSDATE());
    
      DBMS_OUTPUT.PUT_LINE('New row is added to Customers_Archive 
        Table with Customer_ID:' ||:OLD.Customer_id ||'on date:' || SYSDATE());
    END;
    

    在您的原始触发器中,您声明了一个名为 ar_row 的行变量,但没有为任何字段分配任何内容 - 因此它们都是 NULL。在 DELETE 期间调用 BEFORE 触发器时,:OLD 值具有删除之前的值,并且:NEW 值全部为 NULL。

    祝你好运。

    【讨论】:

    • 我试过了,我得到了一个Errors: check compiler log,上面写着:Error(24,3): PL/SQL: Statement ignored Error(25,32): PLS-00201: identifier 'AR_ROW.CUSTOMER_ID' must be declared
    • 是的,我错过了DBMS_OUTPUT 行中的一个。更正它并重试。
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2012-12-16
    • 1970-01-01
    • 2015-04-08
    • 2021-02-22
    • 2021-12-05
    相关资源
    最近更新 更多