Oracle 在异常块中会使用哪些PRAGMA语句?
我在玩Oracle异常,并尝试在Oracle 在异常块中会使用哪些PRAGMA语句?,oracle,oracle11g,Oracle,Oracle11g,我在玩Oracle异常,并尝试在EXCEPTION和WHERE语句之间进行一些预处理。就是 EXCEPTION some_operation_here(); WHEN yaddayadda THEN ... PL/SQL开发人员说这不是犹太教——哦,好吧——但它的错误消息引起了我的兴趣:它期望WHEN或PRAGMA。我并不完全熟悉所有的PRAGMA指令,但它们似乎都不适用于异常块,除非出于某种原因,您一直等到现在才将错误代码绑定到先前声明的异常。为什么在这里需要使用PRAGMA
EXCEPTION
和WHERE
语句之间进行一些预处理。就是
EXCEPTION
some_operation_here();
WHEN yaddayadda THEN
...
PL/SQL开发人员说这不是犹太教——哦,好吧——但它的错误消息引起了我的兴趣:它期望
WHEN
或PRAGMA
。我并不完全熟悉所有的PRAGMA
指令,但它们似乎都不适用于异常块,除非出于某种原因,您一直等到现在才将错误代码绑定到先前声明的异常。为什么在这里需要使用PRAGMA
指令?这是语法错误。要捕获异常,必须使用以下语法:
declare
yaddayadda exception;
begin
...
exception
WHEN yaddayadda THEN
some_operation_here();
end;
您需要使用pragma exception\u Init
为您分配带有sql错误代码的自定义异常。
例如:
declre
l_id number;
e_resource_busy EXCEPTION;
PRAGMA EXCEPTION_INIT(e_resource_busy, -54);
begin
select id
into l_id
from job_table
where status = 'RUNNING'
for update nowait;
exception
WHEN e_resource_busy THEN
-- row is locked
some_operation_here();
end;
一个小实验告诉我,事实上,你可以在异常块中放置一个
PRAGMA
,但我看不出它有什么用处。以下操作成功执行,但引发的错误会触发OTHER
部分,而不是新定义异常的部分(例如,它返回“Old exception”)。这似乎是一个未记录的功能
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;
类似地,我尝试将一个
自治_事务
放在异常块中,但它似乎也没有效果(在本例中,两行都被插入)
(12g,这是我测试这个的版本)没有提到在异常块中使用
PRAGMA
,所以它肯定没有文档记录。另一方面,它似乎不是什么功能,因为它实际上似乎什么都没有做
当{exception_name[或exception_name]…| OTHERS}时
声明[声明]
神秘的也许他们只是在他们的编译器中为假设的概念留出了空间,即未来的新布拉格将在那里有用。我会在一两天内接受这个答案,如果没有人不同意“嗯,我也不知道。”我有一个理论,这是从Ada继承的语法,因为那是PL/SQL的模型。但是,我也找不到任何证据表明Ada允许在异常块中使用
pragma
。
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;