首页 > 解决方案 > 如何在 PL/SQL 中捕获约束违规并给出用户定义的错误消息?

问题描述

当违反检查约束时,如何在 PL/SQL 中提供用户定义的错误消息?

      CREATE TABLE "AP"."SOURCE" 
      (
        ,"RATING" CHAR(30 BYTE)
        ,"SUBMISSION_STATUS" CHAR(12 BYTE)
        ,"UOANAME" CHAR(32 BYTE)
        ,"W_INSERT_DT" TIMESTAMP (6)
        ,"W_UPDATE_DT" TIMESTAMP (6)
        ,"SCIVAL_CIT_CATEGORY" NUMBER(5,0)
        ,"TOTAL_AUTHORS" BINARY_DOUBLE
        ,"REF2014" CHAR(3 BYTE)
      CONSTRAINT "Submission_Rating_not_valid" 
      CHECK ( Submission_status ='To be scored' 
            and Rating is null  
            or Submission_status ='NO' 
            and Rating is null
            or Submission_status = 'Potential'
            and Rating is not null 
            and Rating != 'Not REF Eligible'              
            or  Submission_status ='Yes'
            and Rating is not null
            and Rating != 'Not REF Eligible'
            or  Submission_status ='No'
            and Rating is not null 
            and Rating != 'Not REF Eligible'
            or  Submission_status ='No'
            and Rating = 'Not REF Eligible'*) ENABLE
       )

标签: sqloracle

解决方案


在 PL/SQL 中有一个 EXCEPTION 关键字来处理异常。

EXCEPTION 

然后,您可以在 PL/SQL 块中设置如果执行 PL/SQL 代码引发特定异常该怎么办。

WHEN <name of the exception> THEN <statements to handle it>;

当您需要对所有未提及的异常进行后备时,请使用 OTHERS:

WHEN OTHERS THEN <statements to handle it>;

要使用自定义错误文本为用户引发自定义异常,请使用 RAISE_APPLICATION_ERROR。

例子:

CREATE OR REPLACE PROCEDURE "APEXDEV01"."ADD_OMT_SOURCE" (
  rating VARCHAR2, 
  submission_status VARCHAR2, 
  uoaname VARCHAR2, 
  scival_cit_category NUMBER,
  total_authors BINARY_DOUBLE,
  selfselected VARCHAR2,
  ref2014 VARCHAR2)
AS
BEGIN
  INSERT INTO "APEXDEV01"."OMT_SOURCE" VALUES (
    rating, submission_status, uoaname, SYSDATE, SYSDATE, 
    scival_cit_category, total_authors, selfselected, ref2014);
  EXCEPTION
    WHEN "Submission_Rating_not_valid" THEN
      RAISE_APPLICATION_ERROR(-20081, "Submission rating not valid");
    WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20086,sqlerrm);
END;
/ 

还值得一提的是,您的 DDL 语句中的条件结合了 AND 和 OR,这些条件应由一些括号管理,以避免其逻辑混乱和混乱。


推荐阅读