我正在研究 Oracle 异常,并尝试在 EXCEPTION
和 WHERE
语句之间进行一些预处理。也就是说,
EXCEPTION
some_operation_here();
WHEN yaddayadda THEN
...
PL/SQL Developer 说这不合常理——哦好吧——但它的错误消息引起了我的兴趣:它期望 WHEN
或 PRAGMA
。我并不完全熟悉所有 PRAGMA
指令,但似乎它们中的任何一个都不适用于异常 block ,除非由于某种原因您等到此时将错误代码绑定(bind)到您之前声明的异常(exception)情况。为什么您需要在此处使用 PRAGMA
指令?
最佳答案
一点实验告诉我,实际上您可以在异常 block 中放置一个 PRAGMA
,但我看不出它有多大用处。以下代码执行成功,但引发的错误触发 OTHER
部分,而不是新定义的异常部分(例如,它返回“旧异常”)。看来这是一个未记录的功能。
DECLARE
v NUMBER;
new_divide_zero EXCEPTION;
BEGIN
v := 1 / 0;
EXCEPTION
PRAGMA EXCEPTION_INIT (new_divide_zero, -1476);
WHEN new_divide_zero THEN
DBMS_OUTPUT.put_line ('New exception');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line ('Old exception');
END;
类似地,我尝试将 AUTONOMOUS_TRANSACTION
放入异常 block 中,但它似乎也没有效果(在这种情况下,两行都被插入)。
CREATE TABLE test_results (result VARCHAR2 (2000));
BEGIN
DECLARE
v NUMBER;
new_divide_zero EXCEPTION;
BEGIN
insert into test_results values ('Test Value');
v := 1 / 0;
EXCEPTION
PRAGMA AUTONOMOUS_TRANSACTION;
WHEN OTHERS THEN
INSERT INTO test_results
VALUES ('Old exception');
Commit;
END;
ROLLBACK;
END;
Oracle documentation (12g,这是我测试的版本)没有提到在异常 block 中使用PRAGMA
,所以它绝对没有记录。另一方面,它似乎并没有什么太大的功能,因为它似乎实际上没有做任何事情......
WHEN { exception_name [ OR exception_name ]... | OTHERS } THEN statement [ statement ]...
关于oracle - EXCEPTION block 内将使用哪些 PRAGMA 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149029/