oracle 如何在PL SQL中为ORA-06512、ORA-04088错误添加异常?

x3naxklr  于 2022-12-03  发布在  Oracle
关注(0)|答案(2)|浏览(302)

所以,我正在做这个项目,我添加了以下触发器来检查年龄资格。

create or replace TRIGGER AGEVALIDATION 
BEFORE INSERT OR UPDATE ON RECIPIENT 
FOR EACH ROW
BEGIN
  IF (EXTRACT (YEAR FROM SYSDATE) - EXTRACT (YEAR FROM :NEW.DATE_OF_BIRTH)) < 12 THEN
  raise_application_error(-20001,'VACCINE ELIGIBILITY AGE IS 12 AND ABOVE');
  end if;
END;

以下触发器可以工作,但需要处理以下错误。我需要处理ORA-06512和ORA-6512。有人能帮我吗?

Error starting at line : 1 in command -
INSERT INTO RECIPIENT(RECIPIENT_ID,FIRST_NAME,LAST_NAME,DATE_OF_BIRTH,CONTACT_NUMBER,STREET_ADDRESS,CITY,ZIPCODE,GENDER)
VALUES(152,'Batman1','adams','23-OCT-2019',6172544372,'234 HUNTINGTON AVE','BOSTON','02115','MALE')
Error report -
ORA-20001: VACCINE ELIGIBILITY AGE IS 12 AND ABOVE
ORA-06512: at "APP_ADMIN.AGEVALIDATION", line 3
ORA-04088: error during execution of trigger 'APP_ADMIN.AGEVALIDATION'
omqzjyyz

omqzjyyz1#

触发器并没有完全按照您的想法运行,因为您可以比较2022-01-012010-12-31,2022年和2010年之间的差值为12年,但这两个日期之间的差值仅为11年零1天。您需要使用MONTHS_BETWEEN来比较整个日期:

create or replace TRIGGER AGEVALIDATION 
  BEFORE INSERT OR UPDATE ON RECIPIENT 
  FOR EACH ROW
BEGIN
  IF MONTHS_BETWEEN(SYSDATE, :NEW.DATE_OF_BIRTH) < 12*12 THEN
    raise_application_error(-20001,'VACCINE ELIGIBILITY AGE IS 12 AND ABOVE');
  END IF;
END;
/

小提琴
我需要处理ORA-06512和ORA-6512。
触发器无法“处理”这些异常,因为触发器中没有任何内容会生成这些异常。您看到的可能是从用户定义的异常生成的堆栈跟踪的一部分,可以忽略;但是,您的问题中没有包括完整的堆栈跟踪,因此很难确定。
如果确实需要“处理”某些内容,则应该从执行INSERT的代码中进行处理,而不是在触发器中。

zu0ti5jz

zu0ti5jz2#

您需要捕获的异常是实际引发的-20001。

DECLARE
  excpUser_1  EXCEPTION;
  EXCEPTION_INIT(excpUser_1, -20001);
BEGIN
  UPDATE RECIPIENT SET DATE_OF_BIRTH = SYSDATE - 3650;  -- ten years, more or less
EXCEPTION
  WHEN excpUser_1 THEN
    DBMS_OUTPUT.PUT_LINE('Caught excpUser_1');
END;

相关问题