尽管出现异常,继续 sql 存储过程处理
Continue sql stored proc processing in spite of exceptions
我必须捕获执行存储过程时发生的异常消息。在下面的存储过程中,过程执行并捕获遇到的第一个异常。但是,一旦遇到异常,存储过程就会退出。有没有一种方法可以让存储过程在遇到异常后保持 运行
请帮忙!!!
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;
结束
我必须捕获执行存储过程时发生的异常消息。在下面的存储过程中,过程执行并捕获遇到的第一个异常。但是,一旦遇到异常,存储过程就会退出。有没有一种方法可以让存储过程在遇到异常后保持 运行
请帮忙!!!
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;
结束