簡體   English   中英

使用集合時oracle pl / sql中的no_data_found異常

[英]no_data_found exception in oracle pl/sql while using collection

DECLARE
   TYPE EmpList IS TABLE OF varchar2(50) INDEX BY BINARY_INTEGER;

   temp    SYS_REFCURSOR;
   v_temp  varchar2(50);
   v_emp   EmpList;
BEGIN
   v_emp (1) := 'gaurav';
   v_emp (2) := 'manu';

   open temp for select v_emp(level) from dual connect by level<=2;
   loop
    fetch temp into v_temp;
     exit when temp%notfound;
       DBMS_OUTPUT.put_line (v_temp);
    end loop;
   close temp;

--the below part works, then why not the above part dint works
 for i in v_emp.first..v_emp.last
  loop
      dbms_output.put_line(v_emp(i));
  end loop;

EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (SQLERRM);
END;

誰能告訴我為什么這個集合在這里工作?,它給了我no_data_found異常。

失敗的原因是

v_emp(level) 

在運行時被評估(作為它的一個變量),所以實際上會在所有行上評估為v_emp(0);

如果您將陣列更改為,則可以看到此內容

v_emp (0) := 'gaurav';
v_emp (1) := 'manu';

正確的方法(如果你不知道)是:

create TYPE EmpList IS TABLE OF varchar2(50);
/

接着 :

v_emp := EmpList('gaurav', 'manu');
open temp for select column_value from table(v_emp);

嘗試這個:

DECLARE
   TYPE EmpList IS TABLE OF varchar2(50) INDEX BY BINARY_INTEGER;

   temp    SYS_REFCURSOR;
   v_temp  varchar2(50);
   v_emp   EmpList;
BEGIN
   v_emp (0) := 'gaurav';
   v_emp (1) := 'manu';

   open temp for select v_emp(level) from dual connect by level<=2;
   loop
    fetch temp into v_temp;
        exit when temp%notfound;
       DBMS_OUTPUT.put_line ('v_temp' || v_temp);
    end loop;
   close temp;

--the below part works, then why not the above part dint works
 for i in v_emp.first..v_emp.last
  loop
      dbms_output.put_line(v_emp(i));
  end loop;

EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (SQLERRM);
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM