Oracle 将表名传递给光标

Oracle 将表名传递给光标,oracle,plsql,Oracle,Plsql,可以将表名从一个游标传递到另一个游标。请让我走另一条路 CURSOR R IS SELECT TABLE_NAME FROM RESOURCE ; CURSOR S(TAB VARCHAR2) IS SELECT username from TAB where sid=1291; 是否有其他方法将表传递给游标。您不能将动态sql与游标一起使用-您可能可以使用参考游标来执行所需操作。请参见示例您不能将动态sql与光标一起使用——您可以使用参考光标执行您想要的操作。例如,请参见要展开Jac

可以将表名从一个游标传递到另一个游标。请让我走另一条路

CURSOR  R IS SELECT TABLE_NAME FROM RESOURCE ;


CURSOR S(TAB VARCHAR2) IS SELECT  username from TAB where sid=1291;

是否有其他方法将表传递给游标。

您不能将动态sql与
游标一起使用
-您可能可以使用
参考游标来执行所需操作。请参见示例

您不能将动态sql与
光标一起使用
——您可以使用
参考光标
执行您想要的操作。例如,请参见

要展开JackPDouglas的回答,您不能将参数名称用作光标中的[表]名称。必须在REF游标中使用动态sql

开始示例

create table test1(sid number, username varchar2(50));
insert into test1(sid, username) values(123,'abc');
insert into test1(sid, username) values(123,'ddd');
insert into test1(sid, username) values(222,'abc');
commit;
/



 declare 
  cur  sys_refcursor ;
  sid number ;
  uName varchar2(50) ;
  begin
  sid := 123; 
  dynaQuery('test1',sid, cur);
   LOOP
     FETCH cur INTO uName;
     DBMS_OUTPUT.put_line(uName);
     EXIT WHEN cur%NOTFOUND;
     -- process row here
   END LOOP;
CLOSE CUR;


  end ;
输出:

SELECT USERNAME FROM test1 WHERE sid= :id
abc
ddd
abc
ddd
ddd

编辑:添加了@JackPDouglas正确建议的关闭CUR

要扩展JackPDouglas的答案,您不能将参数名称用作光标中的[表]名称。必须在REF游标中使用动态sql

开始示例

create table test1(sid number, username varchar2(50));
insert into test1(sid, username) values(123,'abc');
insert into test1(sid, username) values(123,'ddd');
insert into test1(sid, username) values(222,'abc');
commit;
/



 declare 
  cur  sys_refcursor ;
  sid number ;
  uName varchar2(50) ;
  begin
  sid := 123; 
  dynaQuery('test1',sid, cur);
   LOOP
     FETCH cur INTO uName;
     DBMS_OUTPUT.put_line(uName);
     EXIT WHEN cur%NOTFOUND;
     -- process row here
   END LOOP;
CLOSE CUR;


  end ;
输出:

SELECT USERNAME FROM test1 WHERE sid= :id
abc
ddd
abc
ddd
ddd
编辑:添加了@JackPDouglas正确建议的关闭CUR

您不应该使用该光标还是不应该使用该光标