注意:以下测试是在sql plus中进行的 ,而非pl/sql。
这里以Oracle的scott/tiger作为示例数据表,Oracle通过返回REF CURSOR来返回结果集。
1.创建包:
- 1 CREATE OR REPLACE PACKAGE TYPES AS
- 2 TYPE BJ_CURSOR IS REF CURSOR;
- 3* END;
- SQL> /
- 程序包已创建。
1 CREATE OR REPLACE PACKAGE TYPES AS
2 TYPE BJ_CURSOR IS REF CURSOR;
3* END;
SQL> /
程序包已创建。
2.创建过程:
- 1 CREATE OR REPLACE PROCEDURE BJ_TEST_PROC
- 2 (
- 3 V_TEMP OUT TYPES.BJ_CURSOR,
- 4 PID IN VARCHAR
- 5 )
- 6 AS
- 7 BEGIN
- 8 OPEN V_TEMP FOR SELECT * FROM emp WHERE deptno = PID;
- 9* END BJ_TEST_PROC;
- SQL> /
- 过程已创建。
1 CREATE OR REPLACE PROCEDURE BJ_TEST_PROC
2 (
3 V_TEMP OUT TYPES.BJ_CURSOR,
4 PID IN VARCHAR
5 )
6 AS
7 BEGIN
8 OPEN V_TEMP FOR SELECT * FROM emp WHERE deptno = PID;
9* END BJ_TEST_PROC;
SQL> /
过程已创建。
3.设置SQLPLUS环境
- SQL> set pagesize 50;
- SQL> set linesize 1024;
- SQL> set serveroutput on;
SQL> set pagesize 50;
SQL> set linesize 1024;
SQL> set serveroutput on;
4.调用过程:
- SQL> var a refcursor
- SQL> var n number
- SQL> exec :n:=10
- PL/SQL 过程已成功完成。
- SQL> call BJ_TEST_PROC(:a,:n);
SQL> var a refcursor
SQL> var n number
SQL> exec :n:=10
PL/SQL 过程已成功完成。
SQL> call BJ_TEST_PROC(:a,:n);
5.输出结果:
- SQL> print a
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
- 7782 CLARK MANAGER 7839 09-6月 -81 2450 10
- 7839 KING PRESIDENT 17-11月-81 5000 10
- 7934 MILLER CLERK 7782 23-1月 -82 1300 10
SQL> print a
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10