两个问题
问题1:在定义游标的时候我想根据不同的输入参数取不同的sql数据; 比如: 如果参数值为 1, select * from t1  否则 select * from t2!
问题2:两个游标能不能互相赋值,应该如何写代码!
谢谢

解决方案 »

  1.   

    1:如果参数是列值:
    CURSOR CUR_EMP(DEPT_VALUE NUMBER) IS
         SELECT EMPNO, ENAME FROM EMP WHERE DEPTNO = DEPT_VALUE;如果是表名值,只有用动态游标了. EXECUTE IMMEDIATE 'SELECT * FROM '||V_TABLENAME;2: 是要实现什么样的需求?
      

  2.   

    1.可以
    2.能
    例子如下:create or replace procedure proc_t(p_i INT,p_o OUT SYS_REFCURSOR) IS
    begin
      IF p_i=1 THEN
       OPEN p_o FOR 'select ename a from scott.emp';
      ELSIF p_i=2 THEN
       OPEN p_o FOR 'select dname a from scott.dept';
      ELSE
        OPEN p_o FOR 'select dummy a from dual';
      END IF;
    end proc_t;
    /DECLARE 
     c SYS_REFCURSOR;
     d SYS_REFCURSOR;
     l_v VARCHAR2(100);
    BEGIN
     dbms_output.put_line('*************1*************');
     proc_t(1,c);
     d:=c; --测试游标赋值
     LOOP
       FETCH d INTO l_v;
       EXIT WHEN d%NOTFOUND;
       dbms_output.put_line(l_v);
     END LOOP;
     dbms_output.put_line('*************2*************');
     proc_t(2,c);
     LOOP
       FETCH c INTO l_v;
       EXIT WHEN c%NOTFOUND;
       dbms_output.put_line(l_v);
     END LOOP;
     dbms_output.put_line('*************3*************');
     proc_t(3,c);
     LOOP
       FETCH c INTO l_v;
       EXIT WHEN c%NOTFOUND;
       dbms_output.put_line(l_v);
     END LOOP;
    END;
    /
    输出:
    *************1*************
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER
    *************2*************
    ACCOUNTING
    RESEARCH
    SALES
    OPERATIONS
    *************3*************
    X
      

  3.   

    问题1你可以用动态游标 如下:
     
     CREATE PROCEDURRE PRO_A ( I_WHERE IN VARCHAR(2) )  --I_WHERE 为传入条件
      IS
      GEGIN
      DECLARE
         STRSQL    VARCHAR2(4000):='';       TYPE CUR_A IS REF CURSOR;  --动态定义游标
           CUR_B CUR_A;
      BEGIN
         STRSQL:='SELECT C, D FROM TABLE WHEWE T1='''|| I_WHERE||'''';  --写游标SQL语句     OPEN COR_B FOR STRSQL;   --打开游标
     
      END;  END;仅供参考,我就这样用过