1
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 例外が発生しています。

4

2 に答える 2

2

失敗の理由は、

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);
于 2013-02-07T23:46:18.677 に答える
1

これを試して:

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;
于 2013-02-08T04:54:36.830 に答える