0

我必须捕获执行存储过程时发生的异常消息。在下面的存储过程中,过程执行并捕获遇到的第一个异常。但是,一旦遇到异常,我存储的过程就会退出。有没有一种方法可以让存储的过程在遇到异常后继续运行

请帮助!

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
4

1 回答 1

0

那是因为您的例外是在您的程序结束时。您可以在循环中捕获异常,它会继续。

当它发生在第二个循环中的任何地方并停留在第一个循环内时,这样的事情会捕获您的异常:

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;

结尾

于 2016-02-12T21:12:37.230 回答