【问题标题】:How to handle cursor exception when the select query returns "zero" records选择查询返回“零”记录时如何处理游标异常
【发布时间】:2019-08-26 16:47:41
【问题描述】:

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

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

但问题是当游标选择查询返回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;

你能解释一下如何处理它。

【问题讨论】:

  • 在您的程序开始时添加out_security_tab := return_security_arr_result();
  • 异常在哪里引发?看起来问题可能出在您调用的其他程序之一中。顺便说一句,如果代码布局整齐会更容易理解。
  • 我添加喜欢你的建议我得到以下错误 ORA-06502: PL/SQL: numeric or value error
  • 我试过这个方法,得到以下错误,其他错误:ORA-06502: PL/SQL: numeric or value error

标签: oracle plsql


【解决方案1】:

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

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

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

  1. 在循环外初始化out_security_tab——这肯定会初始化它
  2. 您可以根据游标行数创建一个out variable,其中包含YN 等详细信息——不推荐

干杯!!

【讨论】:

  • 在我必须添加该条件的情况下,我尝试添加这样的条件,但它对我不起作用
  • begin -- Here -- OPEN cur_security_data;
  • 我只在相同的位置添加,在其他部分,我将“out_security_tab”分配为空值。
  • 不,在我提到的地方添加它
  • 这不是初始化。您必须将其初始化为return_security_arr_result,并将其所有变量都设为空。类似out_security_tab:=return_security_arr_result(null,null,..)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多