ORA-01403:找不到用于插入带有触发器的数据的数据

问题描述 投票:1回答:1

我正在Oracle的SQL Developer环境中创建下表:

CREATE TABLE tbl_cust (
    cust_id         VARCHAR2(4) NOT NULL,
    cust_name       VARCHAR2(50),
    created_date    DATE DEFAULT sysdate,
    trusted         CHAR(1) DEFAULT 'N',
    ind_id          VARCHAR2(4) NOT NULL,
    emp_id          VARCHAR2(4) NOT NULL,
    cust_scont_id   VARCHAR2(4),
    cust_pcont_id   VARCHAR2(4) NOT NULL
);

ALTER TABLE tbl_cust
    ADD CHECK ( trusted IN (
        'N',
        'Y'
    ) );

CREATE UNIQUE INDEX tbl_cust__idx ON
    tbl_cust (
        cust_pcont_id
    ASC );

ALTER TABLE tbl_cust ADD CONSTRAINT tbl_cust_pk PRIMARY KEY ( cust_id );

然后,我正在尝试为该表创建以下触发器;

CREATE OR REPLACE TRIGGER TRG_TRUSTED_CUSTOMER
    BEFORE INSERT OR UPDATE 
    ON tbl_cust 
    FOR EACH ROW 

DECLARE
    v_no_of_days number;

BEGIN
    IF (:new.cust_id is not null AND UPPER(:NEW.TRUSTED) = 'Y')  THEN
    --SELECT to_number(to_date(sysdate, 'dd-mm-yyyy') - to_date(c.created_date, 'dd-mm-yyyy')) INTO v_no_of_days
    SELECT to_number(to_date(TRUNC(sysdate), 'dd-mm-yyyy') - to_date(c.created_date, 'dd-mm-yyyy')) INTO v_no_of_days
    FROM tbl_cust c
    WHERE c.cust_id = :new.cust_id;
            IF (v_no_of_days  <= 365)   THEN
            raise_application_error(-20022, 'The customer is not trusted yet');
            END IF;
    END IF;
END;

并且当我尝试插入以下数据时

INSERT INTO tbl_cust(cust_id, cust_name, created_date, trusted, ind_id, emp_id, cust_scont_id, cust_pcont_id) 
VALUES ('C500', 'GOODMAN', '01-DEC-19', 'Y', 'IN03', 'E005','SA05', 'PA05');

我收到此错误

Error starting at line : 26 in command -
INSERT INTO tbl_cust(cust_id, cust_name, created_date, trusted, ind_id, emp_id, cust_scont_id, cust_pcont_id) 
VALUES ('C500', 'GOODMAN', '01-DEC-19', 'Y', 'IN03', 'E005','SA05', 'PA05')
Error report -
ORA-01403: no data found
ORA-06512: at "TTAPADAR.TRG_TRUSTED_CUSTOMER", line 7
ORA-04088: error during execution of trigger 'TTAPADAR.TRG_TRUSTED_CUSTOMER'

任何帮助将不胜感激。

oracle database-trigger
1个回答
2
投票

您可以重新排列为

CREATE OR REPLACE TRIGGER TRG_TRUSTED_CUSTOMER
  BEFORE INSERT OR UPDATE ON tbl_cust
  FOR EACH ROW

DECLARE
  v_no_of_days number;

BEGIN
  IF (:new.cust_id is not null AND UPPER(:NEW.TRUSTED) = 'Y') THEN
        v_no_of_days := trunc(sysdate) - :new.created_date;
  END IF;

  IF (v_no_of_days <= 365) THEN
      raise_application_error(-20022, 'The customer is not trusted yet');
  END IF;  
END;

尝试通过尚未插入的:new.cust_id选择时插入表格。

顺便说一句,由于要从创建触发器的表中进行选择,因此可能会增加触发器突变的风险。

© www.soinside.com 2019 - 2024. All rights reserved.