STR VARCHAR2(100);
BEGIN
STR:='OPEN CUR_A FOR SELECT * FROM '||T_TBNAME;
execute immediate STR;
...
你这样试一下吧,我没试过,把结果告诉我

解决方案 »

  1.   

    declare 
       type curtype is fet cursor;
       emp_cv   curtype;
       my_sql number:=1000;
     
    ...begin
     open emp_cv for 'select ename,sal from emp where sal>:s' using my_sql;
     ...
    end;
      

  2.   

    楼上说的是本地动态sql.还有一种动态sql是用dbms_sql包实现的,这种动态sql比本地动态sql效率要低。
    好像ref cursor也可以实现动态sql的功能。
      

  3.   

    这样动态的cursor我试过,但是不行。
      

  4.   

    两个动态sql:
    DECLARE
       sql_stmt VARCHAR2(200);
       my_empno NUMBER(4) := 7902;
       my_ename VARCHAR2(10);
       my_job   VARCHAR2(9);
       my_sal   NUMBER(7,2) := 3250.00;
    BEGIN
       sql_stmt := 'UPDATE emp SET sal = :1 WHERE empno = :2
          RETURNING ename, job INTO :3, :4';   /* Bind returned values through USING clause. */
       EXECUTE IMMEDIATE sql_stmt
          USING my_sal, my_empno, OUT my_ename, OUT my_job;   /* Bind returned values through RETURNING INTO clause. */
       EXECUTE IMMEDIATE sql_stmt
          USING my_sal, my_empno RETURNING INTO my_ename, my_job;
       ...
    END;DECLARE
       TYPE EmpCurTyp IS REF CURSOR;  -- define weak REF CURSOR type
       emp_cv   EmpCurTyp;  -- declare cursor variable
       my_ename VARCHAR2(15);
       my_sal   NUMBER := 1000;
    BEGIN
       OPEN emp_cv FOR  -- open cursor variable
          'SELECT ename, sal FROM emp WHERE sal > :s' USING my_sal;
       ...
    END;
      

  5.   


     Create or Replace Package pk_test as
       type t_cur is ref cursor ; 
       function GetData(Sql varchar2) return t_cur;
     end pk_test;
     
     Create or Replace Package Body pk_tst as    function GetData(Sql varchar2) return t_cur
       as rs t_cur;
        
       begin
          open cursor for sql ;
          return cursor;
          Exception 
            when othrs then 
              return rs;
       end ;
    end pk_test;