CREATE TABLE emp(
empno NUMBER(4) NOT NULL, --职工编号
ename VARCHAR2(10), --职工姓名
hiredate DATE, --雇佣日期
sal NUMBER(7,2), --工资
deptno NUMBER(2)); --所属部门编号
下面给出返回记录集的Oracle存储过程和存储函数的示例程序包头和包体,其中存储过程GetEmpRecords含有两个REF CURSOR类型的传出参数,返回两个记录集,存储函数GetDept的返回值类型为REF CURSOR,返回一个记录集。
--定义一个名为Employees的程序包头
CREATE OR REPLACE PACKAGE Employees AS
TYPE empcur IS REF CURSOR;
--empcur为自定义REF CURSOR类型
--声明一个存储过程GetEmpRecords
PROCEDURE GetEmpRecords(p_cursor OUT empcur,
q_cursor OUT empcur,
indeptno IN NUMBER,
p_errorcode OUT NUMBER);
--声明一个存储函数GetDept
FUNCTION GetDept(inempno IN NUMBER,
p_errorcode OUT NUMBER)
RETURN empcur;
END Employees; ---程序包头定义结束
--定义Employees的程序包体
--定义存储过程GetEmpRecords
CREATE OR REPLACE PACKAGE BODY Employees AS PROCEDURE GetEmpRecords(p_cursor OUT empcur, q_cursor OUT empcur,
indeptno IN NUMBER, p_errorcode OUT NUMBER) IS
BEGIN
p_errorcode := 0; -- p_errorcode为错误编号
--打开游标变量p_cursor,查询所属部门编号
--为indeptno的所有职工的信息
OPEN p_cursor FOR
SELECT * FROM emp
WHERE deptno = indeptno ORDER BY empno;
--打开游标变量q_cursor,查询所属部门编号
--为indeptno的所有职工的编号信息
OPEN q_cursor FOR
SELECT empno FROM emp
WHERE deptno = indeptno ORDER BY empno;
EXCEPTION --例外处理
WHEN OTHERS THEN
p_errorcode:= SQLCODE;
END GetEmpRecords; --存储过程GetEmpRecords定义结束
--定义存储函数GetDept
FUNCTION GetDept(inempno IN NUMBER,
p_errorcode OUT NUMBER)
RETURN empcur IS p_cursor empcur; --返回值
BEGIN
p_errorcode := 0;
--查询职工编号为inempno的职工的所属部门编号
OPEN p_cursor FOR
SELECT deptno FROM emp WHERE empno = inempno;
RETURN (p_cursor);
EXCEPTION
WHEN OTHERS THEN
p_errorcode:= SQLCODE;
END GetDept;
END Employees; --程序包体定义结束
4 利用ADO调用返回记录集的Oracle存储过程
使用OLE DB和ADO调用返回记录集的Oracle存储过程,在定义ADO对象和设置参数时,需要特定的设置。
4.1 设定数据库连接字符串
在ADO程序中,如果要访问返回记录集的Oracle存储过程,需要使用OraOLE DB的数据库连接字符串的指定格式。在连接字符串中,PLSQLRSet属性表明OraOLE DB是否需要从PL/SQL存储过程返回记录集。如果需要返回记录集,PLSQLRSet设为1,否则设置为0,默认为 0。在Command命令执行后,该属性需要设置为0。
4.2 参数的设置
在ADO应用程序中,可以定义调用存储过程的参数。可使用Command对象的CreateParameter 创建Parameter 对象,并使用 Append 方法将它们添加到 Parameters 集合,在调用存储过程时,Parameters 集合将参数传递给存储过程。由于OraOLE DB采用定位传递参数的格式,即Command对象在调用存储过程时,调用参数的位置应和存储过程的参数的位置相对应。根据调用的存储过程的参数属性、名称和位置,在ADO中, Append 方法添加参数的次序应和存储过程中参数的顺序一致。
在OLE DB的标准中,没有REF CURSOR类型的预定义数据类型,因此在调用存储过程时,不能创建REF CURSOR类型的参数。在ADO调用返回记录集的存储过程时,OLE DB自动为存储过程中REF CURSOR类型的传出参数返回记录集,该记录集可以赋值给一个Recordset对象。如果PL/SQL存储过程有一个或多个REF CURSOR类型的传出参数,OLE DB将这些参数的记录集集成在一起,并通过第一个REF CURSOR类型的传出参数返回,这些记录集同样可以赋值给一个Recordset对象。
