未定义的错误异常处理 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的主要内容,如果未能解决你的问题,请参考以下文章

会话未在nifi自定义处理器内关闭异常

在 micronaut 中覆盖未找到的异常处理程序

在 WPF 的子线程中捕获未处理的异常

10.异常处理自定义异常断言

php 异常处理 如何捕获异常??必须要抛出才可以吗?

python 异常处理