使用集合时在oracle pl/sql中未发现异常 声明 类型EmpList是varchar2(50)索引由二进制_整数组成的表; 温度系统参考光标; v_温度varchar2(50); v_emp雇主; 开始 v_emp(1):=“gaurav”; v_emp(2):=“手动”; 从双连接逐层选择v_emp(层)的打开温度

使用集合时在oracle pl/sql中未发现异常 声明 类型EmpList是varchar2(50)索引由二进制_整数组成的表; 温度系统参考光标; v_温度varchar2(50); v_emp雇主; 开始 v_emp(1):=“gaurav”; v_emp(2):=“手动”; 从双连接逐层选择v_emp(层)的打开温度,oracle,collections,plsql,Oracle,Collections,Plsql,故障原因是 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

故障原因是

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;
在运行时进行计算(作为一个变量),因此实际上会对要计算的所有行进行计算
v_emp(0)

如果将数组更改为

v_emp(level) 
正确的方法(如果您不知道)是:

然后:

create TYPE EmpList IS TABLE OF varchar2(50);
/
试试这个:

v_emp := EmpList('gaurav', 'manu');
open temp for select column_value from table(v_emp);
声明
类型EmpList是varchar2(50)索引由二进制_整数组成的表;
温度系统参考光标;
v_温度varchar2(50);
v_emp雇主;
开始
v_emp(0):='gaurav';
v_emp(1):=“手动”;

打开从dual connect by level选择v_emp(级别)的temp您在哪里声明了
v_temp
?@rs:很抱歉,这是一个打字错误,已更正
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;