选择查询返回“零”记录时如何处理游标异常

时间:2019-08-26 07:46:53

标签: oracle plsql

当选择查询返回“零”记录时如何处理游标异常

我在过程中有一个游标,在游标初始化之后,我遍历游标以访问其中的数据。

但是问题是,当游标选择查询返回0条记录时,它将引发异常

  

ORA-06531:引用未初始化的集合。

如何处理此异常?

--- 程序代码

create or replace PROCEDURE BIQ_SECURITY_REPORT 
             (out_chr_err_code   OUT VARCHAR2,
              out_chr_err_msg    OUT VARCHAR2,
              out_security_tab   OUT return_security_arr_result   ,

             )
IS             

      l_chr_srcstage     VARCHAR2 (200);
      lrec               return_security_report;


CURSOR cur_security_data IS
    SELECT
    "ID"                  "requestId",
    "ROOM"                "room",
    "FIRST_NAME"          "FIRST_NAME",
    "LAST_NAME"           "LAST_NAME",

FROM
   "BI_REQUEST_CATERING_ACTIVITY" ;

   TYPE rec_security_data IS TABLE OF cur_security_data%ROWTYPE
   INDEX BY PLS_INTEGER;
   l_cur_security_data   rec_security_data;  


begin


      OPEN cur_security_data;

      LOOP      
         FETCH cur_security_data
         BULK COLLECT INTO l_cur_security_data
         LIMIT 1000;

         EXIT WHEN l_cur_security_data.COUNT = 0;

        lrec := return_security_report();
        out_security_tab  := return_security_arr_result(return_security_report());
        out_security_tab.delete;


   FOR i IN 1 .. l_cur_security_data.COUNT
       LOOP


        BEGIN  

           l_num_counter                := l_num_counter + 1;
            lrec                         := return_security_report();
       lrec.requestid              := l_cur_security_data(i).requestId ;                                   lrec.room                 := l_cur_security_data(i).room ;                                  lrec.firstName              := l_cur_security_data(i).firstName ;

               IF l_num_counter > 1 
                      THEN
                         out_security_tab.extend();
                         out_security_tab(l_num_counter) := return_security_report();
                 ELSE
              out_security_tab := return_security_arr_result(return_security_report());
                     END IF;
                     out_security_tab(l_num_counter) := lrec; 

        EXCEPTION             
                WHEN OTHERS 
               THEN
         DBMS_OUTPUT.PUT_LINE('Error occurred : '  || SQLERRM);
               END; 

           END LOOP;              
       END LOOP;              


   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.PUT_LINE ('HERE INSIIDE OTHERS' || SQLERRM);
   END;

请您说明一下处理方法。

1 个答案:

答案 0 :(得分:0)

您必须使用out_security_tab,这是调用该过程的其他代码中的输出参数。

在您的过程中,如果游标返回零行,则将不会执行循环,并且您的代码甚至不会初始化out_security_tab,这将导致您面临的错误。

有一个简单的方法可以避免:

  1. 在循环外初始化out_security_tab -肯定会初始化
  2. 您可以根据游标行是否计数来创建一个包含out variableY的详细信息的N-不推荐

干杯!