【发布时间】:2015-11-25 20:19:25
【问题描述】:
我在 Oracle SQL Developer 11g 上创建了以下 PL/SQL 过程,并希望强制测试异常以确保我编码到其中的电子邮件确实在异常发生时发送出去。有人可以告诉我该怎么做吗?
create or replace
procedure Procedure_1 as
-- This script updates the 'owner_id' field on Schema.table1 to 'SYSADMIN' for FISCAL, BREAKDWN, and PROGRAM table types.
--
v_code number;
v_errm varchar2(512);
vOM_Recipients VARCHAR2(200) := 'personal_email@email.com';
begin
update Schema.table1
set owner_id = 'SYSADMIN'
where table_type in ('FISCAL','BREAKDWN','PROGRAM') and owner_id <> 'SYSADMIN';
commit;
EXCEPTION
WHEN OTHERS THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM, 1 , 512);
UTL_MAIL.send(sender => 'automated_email@email.com',
recipients => vOM_Recipients,
subject => 'Procedure_1 Job Error',
message => 'Procedure_1 Job Error.' || chr(10) || chr(10) ||
'The error code is '||v_code||'-'||v_errm||' ');
end;
【问题讨论】:
-
取决于你有能力做什么。您可以在此过程的开头临时添加一个“raise_application_error”调用吗?或者从拥有此过程的任何用户撤消对 Schema.table1 的更新?还是重命名表?或者对表上的 owner_id 设置唯一约束?或者将 owner_id 更改为与 'SYSADMIN' 不兼容的数据类型?
-
克雷格,感谢您的回复。我是程序的所有者,并且可以完全控制随意更新程序。我应该添加什么样的“raise_application_error”行来强制异常?
-
如果你只是想抛出一个随机错误
raise_application_error(-20001, 'Some Random Message');. -
谢谢你,贾斯汀!这回答了我的问题。
标签: sql oracle exception-handling oracle-sqldeveloper procedure