Как отследить нарушение ограничения и выдать пользовательское сообщение об ошибке в PL / SQL? - PullRequest
0 голосов
/ 03 октября 2018

Как предоставить пользовательское сообщение об ошибке в 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
       )

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

В 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, и некоторые из них должны управляться скобками, чтобы избежать путаницы и путаницы в его логике.

0 голосов
/ 03 октября 2018

вам нужна одна скобка и используйте отдельные скобки для и / или условия

    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

   )
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...