sql - 如何在 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
)
解决方案
在 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,这些条件应由一些括号管理,以避免其逻辑混乱和混乱。
推荐阅读
- c++ - 在 UNICODE_STRING 中搜索字符
- python - 使用 UDP 套接字在 python 中发送连续数据
- actions-on-google - Surface Capabilities——区分智能显示器和移动设备
- android - 找一个点(LatLng) X 米/km 远离拾取点(LatLng) 并且不应该在水中(Sea)
- azure - 无法在 Azure 批处理池上安装 python - 返回无效参数
- python - 直接访问(没有迭代器)边缘及其属性
- vlsi - 如何在 APB 协议中从从机生成 PREADY 信号?
- python - TkInter 在线程运行时禁用按钮
- python - 从输入文本框中获取空字符串而不是输入的值
- javascript - 为遮罩图像分配更高的 z-index