最近刚接触oracle 关于游标的使用,有些疑惑,
create or replace package system.pkg_Test
  as
  type my_rc_type is ref cursor;
  end pkg_Testcreate or replace procedure system.pro_Test
(
 p_cursor out system.pkg_test.my_rc_type,
 p_isectorid in number
)
is
begin
   open p_cursor for
select 
 [*]
from 
  [表名]
where
 [条件];
end system.pro_Test;在调用此存储过程获取p_cursor 数据以后,不知道p_cursor 是否会被关闭掉,或者说不知道怎么去关闭掉,
还有在多个用户操作此存储过程时,游标会不会影响速度,还有是否需要为每一个存储过程定义一个游标,
如果p_cursor 需要关闭,那么在程序调用完毕此存储过程之后如何关闭游标,望大家不吝赐教

解决方案 »

  1.   

    DBMS_SQL
    操作游标比较好执行关闭都有
      

  2.   

    CREATE OR REPLACE PROCEDURE ddlproc (tablename varchar2, cols varchar2) AS
       cursor1 INTEGER;
      BEGIN
       cursor1 := dbms_sql.open_cursor;
       dbms_sql.parse(cursor1, 'CREATE TABLE ' || tablename || ' ( ' || cols || ' )', dbms_sql.v7);
       dbms_sql.close_cursor(cursor1);
      end;
      

  3.   

    注意执行 ddl dml的区别
      

  4.   

    油表变量使用步骤,
    1定义REF CURSOR和变量 type .. ref cursor
    2打开游标 ; open .. for
    3提取游标数据;fetch into..
    4关闭游标; close ..
    所以你那存储过程只是定义和打开。还没有提取游标数据,等提取完毕后使用close ..可以关闭游标
      

  5.   

    需要这么玩。
    CREATE OR REPLACE PACKAGE PKG_TEST AS
      TYPE MY_RC_TYPE IS REF CURSOR;
    END PKG_TEST;
    /CREATE OR REPLACE PROCEDURE PRO_TEST(P_CURSOR    OUT PKG_TEST.MY_RC_TYPE,
                                         P_ISECTORID IN NUMBER) IS
    BEGIN
      OPEN P_CURSOR FOR
        SELECT ENAME FROM SCOTT.EMP;
    END PRO_TEST;
    /DECLARE
        l_v VARCHAR2(100);
        l_c PKG_TEST.MY_RC_TYPE;
    BEGIN
       pro_test(l_c,1);
       LOOP
        FETCH l_c INTO l_v;
        EXIT WHEN l_c%NOTFOUND;
        dbms_output.put_line(l_V);
       END LOOP;
       CLOSE l_c;
    END;
    /输出:
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER