如果要在procedure中返回一个记录集, 有两种方法, 一种是使用ref cursor, 另一种方法是使用pipelined function, 这里只讲述ref cursor.
Oracle8i, 如果你的存储过程需要返回一个记录集, 那么必须要将这个存储过程放在一个package中, 因为你必须首先定义一个ref cursor类型, 而这个类型只能放在package中定义, 对你而言, 没有其他地方可以定义类型. 记录集类型可以是强类型的, 也可以定义成非强类型的.
create or replace package sprs_temp_obj.PKG_SPRS_SMPLU_H_IND
IS
TYPE c_return_table IS REF CURSOR; --这是一个非强类型记录集类型
TYPE emp_cur_type IS REF CURSOR RETURN emp%ROWTYPE; --这里定义了一个强类型的记录类型
END PKG_SPRS_SMPLU_H_IND;
定义之后, 就可以在PKG_SPRS_SMPLU_H_IND package的body中使用这两个记录集类型了.
在Oracle9i, 系统已经有一个SYS_REFCURSOR类型, 所以你的存储过程不必一定要放在某个package里了.
procedure proce1( emp_refcur out SYS_REFCURSOR) -- 这定义了一个非强类型的记录集
is
begin
Open emp_refcur For
select * from emp;
end proce1;
那么非强类型的Ref cursor 和sys_refcursor的区别是什么呢?
A REF CURSOR that does not specify the return type such as SYS_REFCURSOR. Meaning the SYS_REFCURSOR can be opened for a dynamic SQL query, where as simple REF CURSOR can not be opened for a query dynamically built at execution time.
No comments:
Post a Comment