我正在使用Oracle异常,并尝试在EXCEPTION
和WHERE
语句之间进行一些预处理。也就是说,
EXCEPTION
some_operation_here();
WHEN yaddayadda THEN
...
PL / SQL开发人员说这不是犹太人 - 哦 - 但是它的错误信息引起了我的兴趣:它期待WHEN
或PRAGMA
。我并不完全熟悉所有PRAGMA
指令,但看起来它们中的任何一个都不适用于异常块,除非由于某种原因你等到这一点将错误代码绑定到异常你之前宣布过的。为什么你需要在这里使用PRAGMA
指令?
答案 0 :(得分:4)
一些小实验告诉我,您实际上可以在异常块中添加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
,但它似乎也没有效果(在这种情况下,两行都插入了)。
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,这是我测试过的版本)没有提到在异常块中使用PRAGMA
,因此它绝对没有文档记录。另一方面,它似乎不是一个特征,因为它似乎没有实际做任何事情......
WHEN {exception_name [OR exception_name] ... |其他}那么 声明[声明] ......
答案 1 :(得分:0)
这是语法错误。要捕获异常,必须使用以下语法:
declare
yaddayadda exception;
begin
...
exception
WHEN yaddayadda THEN
some_operation_here();
end;
您需要使用pragma exception_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;