REF CURSOR 示例

REF CURSOR 示例由以下三个Microsoft Visual Basic 示例组成,这些示例演示如何使用 REF CURSOR。

示例 DESCRIPTION
OracleDataReader 中的 REF CURSOR 参数 此示例执行一个 PL/SQL 存储过程,该存储过程返回 REF CURSOR 参数,并将值读取为一个 OracleDataReader
使用 OracleDataReader 从多个 REF CURSOR 检索数据 此示例执行 PL/SQL 存储过程,该存储过程返回两个 REF CURSOR 参数,并使用 OracleDataReader 读取值。
使用一个或多个 REF CURSOR 填充数据集 此示例执行一个 PL/SQL 存储过程,该存储过程返回两个 REF CURSOR 参数,并填充 DataSet 返回的行。

若要使用这些示例,可能需要创建 Oracle 表,并且必须创建 PL/SQL 包和包正文。

创建 Oracle 表

这些示例使用 Oracle Scott/Tiger 架构中定义的表。 Oracle Scott/Tiger 架构包含在大多数 Oracle 安装中。 如果此架构不存在,可以使用 {OracleHome} 中的 SQL 命令文件\rdbms\admin\scott.sql创建这些示例使用的表和索引。

创建 Oracle 包和包正文

这些示例要求服务器上的以下 PL/SQL 包和包正文。 在 Oracle 服务器上创建以下 Oracle 包。

CREATE OR REPLACE PACKAGE CURSPKG AS
    TYPE T_CURSOR IS REF CURSOR;
    PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,
                               IO_CURSOR IN OUT T_CURSOR);
    PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,
                                DEPTCURSOR OUT T_CURSOR);  
END CURSPKG;  
/

在 Oracle 服务器上创建以下 Oracle 包正文。

CREATE OR REPLACE PACKAGE BODY CURSPKG AS  
    PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,  
                               IO_CURSOR IN OUT T_CURSOR)  
    IS
        V_CURSOR T_CURSOR;
    BEGIN
        IF N_EMPNO <> 0
        THEN  
             OPEN V_CURSOR FOR
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
                  FROM EMP, DEPT
                  WHERE EMP.DEPTNO = DEPT.DEPTNO
                  AND EMP.EMPNO = N_EMPNO;  
  
        ELSE
             OPEN V_CURSOR FOR
             SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
                  FROM EMP, DEPT
                  WHERE EMP.DEPTNO = DEPT.DEPTNO;  
  
        END IF;  
        IO_CURSOR := V_CURSOR;
    END OPEN_ONE_CURSOR;
  
    PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,  
                                DEPTCURSOR OUT T_CURSOR)  
    IS
        V_CURSOR1 T_CURSOR;
        V_CURSOR2 T_CURSOR;
    BEGIN
        OPEN V_CURSOR1 FOR SELECT * FROM EMP;  
        OPEN V_CURSOR2 FOR SELECT * FROM DEPT;  
        EMPCURSOR  := V_CURSOR1;
        DEPTCURSOR := V_CURSOR2;
    END OPEN_TWO_CURSORS;
END CURSPKG;  
/  

另请参阅