【问题标题】:How to catch constraint violation and give a user defined error message in PL/SQL?如何在 PL/SQL 中捕获约束违规并给出用户定义的错误消息?
【发布时间】:2018-10-03 10:03:13
【问题描述】:

当违反检查约束时,如何在 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
       )

【问题讨论】:

  • 在混合 AND 和 OR 时要小心...也许需要一些括号。
  • 格式化后更易于阅读,您可以看到 AND / OR 组合确实需要括号。
  • 除了上面提到的方面,请看一下Oracle保留名称和关键字。并且如果您为表名和列指定双引号,那么您在将来引用时必须使用双引号。
  • 感谢大家的有用建议和提示。我已经改了。

标签: sql oracle


【解决方案1】:

在 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,这些条件应由一些括号管理,以避免其逻辑混乱和混乱。

【讨论】:

  • 嗨 Miroslav,我尝试了您的上述脚本,但出现错误 - Error(66,2): PLS-00103: Encountered the symbol "BEGIN" when expecting 以下之一:; is with authid as cluster order using external deterministic parallel_enable pipelined result_cache 可访问符号“is”被替换为“BEGIN”以继续。
  • Praveen,你是对的,我的错。我没有在实际数据库中测试代码。我错过了“AS”声明。这里重要的是 EXCEPTION 部分。
【解决方案2】:

你需要一个括号,并为和或条件使用单独的括号

    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

   )
 )

【讨论】:

  • 感谢 Zaynul 非常有帮助
  • 我试图在违反检查约束而不是默认错误消息时创建用户定义的错误。我正在寻求帮助。
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2013-11-27
相关资源
最近更新 更多