未定义的错误异常处理 inpl/sql
Posted
技术标签:
【中文标题】未定义的错误异常处理 inpl/sql【英文标题】:undefined error exception handling inpl/sql 【发布时间】:2017-01-24 23:34:55 【问题描述】:我是 pl/sql 编程的新手。 我有一个任务: “Brewbean 想要在 BB_BASKETITEM 表的 QUANTITY 列上添加检查约束。如果购物者输入的商品数量值大于 20,Brewbean 想要在屏幕上显示消息“检查数量”。使用文本编辑器,打开在 Chapter04 文件夹中的 assignment04-06.txt 文件。必须执行第一条语句 ALTER TABLE 以添加检查约束。下一项是 PL/SQL 块,其中包含测试此检查约束的 INSERT 操作。向此添加代码阻止以捕获检查约束违规并显示消息。” 我试过了,像这样-
set serveroutput on;
declare
ex_basket exception;
pragma EXCEPTION_INIT(ex_basket, -02290);
BEGIN
ALTER TABLE bb_basketitem
ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);
INSERT INTO bb_basketitem
VALUES (88,8,10.8,21,16,2,3);
exception
when ex_basket then
DBMS_OUTPUT.PUT_LINE('Check Quantity');
END;
我收到这样的错误报告:
ORA-06550:第 5 行,第 1 列: PLS-00103:在期待其中一个时遇到符号“ALTER” 以下:
( begin case declare exit for goto if loop mod null pragma raise 使用
时返回选择更新
对不起这个廉价的问题。我希望有人能在这方面提供帮助。
【问题讨论】:
【参考方案1】:您需要了解 SQL 和 PL/SQL 是两种不同的语言。 ALTER TABLE
是 SQL 语句,而不是 PL/SQL。您不能在 PL/SQL 块内运行静态 SQL DDL 语句。然而,PL/SQL 很容易通过它提供的许多特性集成到 SQL 中。这些功能之一是EXECUTE IMMEDIATE。
因此,您需要将 yoru ALTER 语句更改为如下所示:
EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);'
【讨论】:
【参考方案2】:对您的代码非常具体。以下代码足以解决您的问题。
SET serveroutput ON;
DECLARE
ex_basket EXCEPTION;
pragma EXCEPTION_INIT(ex_basket, -02290);
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);';
INSERT INTO testab VALUES
(88
);
EXCEPTION
WHEN ex_basket THEN
dbms_output.put_line('Check Quantity');
END;
【讨论】:
【参考方案3】:关于异常处理,这是在运行时发生的事情。但是,如果您的代码中有一个无法识别的关键字,例如 ALTER
,那么它甚至不会首先编译,所以它根本不会运行。相反,整个区块被视为无效而被拒绝。
另外,dbms_output
通常不是异常处理的好选择,因为它会在输出缓冲区上放置一条调试消息并允许块成功完成,因此无论它属于哪个脚本都不会认为出了什么问题。您可以考虑使用raise
or raise_application_error
。
【讨论】:
以上是关于未定义的错误异常处理 inpl/sql的主要内容,如果未能解决你的问题,请参考以下文章