Exception handling 尽管出现异常,仍继续sql存储过程处理
我必须捕获执行存储过程时发生的异常消息。在下面存储的proc中,proc执行并捕获遇到的第一个异常。但是,我认为一旦遇到异常,存储过程就会退出。是否有一种方法可以让存储过程在遇到异常后仍保持运行 请帮忙Exception handling 尽管出现异常,仍继续sql存储过程处理,exception-handling,cisco,information-server,Exception Handling,Cisco,Information Server,我必须捕获执行存储过程时发生的异常消息。在下面存储的proc中,proc执行并捕获遇到的第一个异常。但是,我认为一旦遇到异常,存储过程就会退出。是否有一种方法可以让存储过程在遇到异常后仍保持运行 请帮忙 PROCEDURE Test_script (OUT XYZRow) BEGIN DECLARE Veiw_Name VARCHAR(2147483647); DECLARE Object_Name VARCHAR(2147483647);
PROCEDURE Test_script (OUT XYZRow)
BEGIN
DECLARE Veiw_Name VARCHAR(2147483647);
DECLARE Object_Name VARCHAR(2147483647);
DECLARE Object_Type VARCHAR(2147483647);
DECLARE Domain_Name VARCHAR(2147483647);
DECLARE Status VARCHAR(2147483647);
DECLARE "READ" VARCHAR(100);
DECLARE PUBLIC SetException EXCEPTION;
for r as select
*
from table1 do
for r2 as SELECT
r1.name as Object_Nam,
r1.nameType as Object_Typ,
r1."domain" as domain_nam,
CASE r1.Status AS Status,
CASE r1.c_R AS READ_Stat
FROM function_xyz(r.PATH) r1
do
set Veiw_Name = r.PATH;
set Object_Name = r2.Object_Nam;
set Object_Type = r2.Object_Typ;
set Domain_Name = r2.domain_nam;
set Status = r2.Status;
set "READ" = r2.Read_Stat;
INSERT INTO XYZRow VALUES (Veiw_Name, Object_Name, Object_Type, Domain_Name, Status, "READ");
end for;
end for;
EXCEPTION
WHEN System.SystemException THEN
CALL PRINT(CURRENT_EXCEPTION.MESSAGE);
END
这是因为您的异常在您的过程的末尾。您可以在循环中捕获异常,它将继续 当异常发生在第二个循环中的任何位置并停留在第一个循环中时,类似这样的操作会捕获异常:
PROCEDURE Test_script (OUT XYZRow)
BEGIN
DECLARE Veiw_Name VARCHAR(2147483647);
DECLARE Object_Name VARCHAR(2147483647);
DECLARE Object_Type VARCHAR(2147483647);
DECLARE Domain_Name VARCHAR(2147483647);
DECLARE Status VARCHAR(2147483647);
DECLARE "READ" VARCHAR(100);
DECLARE PUBLIC SetException EXCEPTION;
for r as select * from table1 do
--
-- The entire LOOP will be trapped by the EXCEPTION
--
begin
for r2 as SELECT
r1.name as Object_Nam,
r1.nameType as Object_Typ,
r1."domain" as domain_nam,
CASE r1.Status AS Status,
CASE r1.c_R AS READ_Stat
FROM function_xyz(r.PATH) r1
do
set Veiw_Name = r.PATH;
set Object_Name = r2.Object_Nam;
set Object_Type = r2.Object_Typ;
set Domain_Name = r2.domain_nam;
set Status = r2.Status;
set "READ" = r2.Read_Stat;
INSERT INTO XYZRow VALUES (Veiw_Name, Object_Name, Object_Type, Domain_Name, Status, "READ");
end for;
EXCEPTION
WHEN System.SystemException THEN
CALL PRINT(CURRENT_EXCEPTION.MESSAGE);
END;
--
-- If exception occurs, execution will resume here and the first
-- loop will continue
--
end for;
END这看起来像是T-SQL而不是oracle PLSQL。您是否正确标记了它?它实际上在Cisco信息服务器中,早期称为复合软件。。数据虚拟化工具。。后端是oracle数据库,但。。。希望这有帮助!有人能帮我解决这个问题吗?忽略异常可能是最糟糕的做法,所以我希望这不是生产代码,但无论如何。“保持运行”的唯一方法是在
BEGIN-exception WHEN-END
exception处理程序中包装每个可能引发异常的语句,而不是捕获一次异常。当我们调用函数_xyz(r.PATH)。。它是一个需要调用的存储过程。。当我按照您的指示操作时,proc无法捕获异常。我在for中使用了游标。。选择。。do循环,当它调用函数_xyz时,它抛出我需要捕获的错误。你知道如何破解它吗?它看起来有点像PL-SQL,但语法有点不同,所以我会尽力破解它,但你可能需要对它进行调整。Wppw Marco。。。令人惊讶!!代码捕获异常并继续循环。。谢谢惊人的逻辑。。。好兄弟!!别忘了把答案标为“有用”。不知怎的,这就是我们的薪水:)