在项目有个procedure返回一个cursor变量。 但sql的执行效率很低,于是决定用dynamic sql, 也在网上搜了下, 自己写了个例子。
create or replace procedure emp_select(deptno in number, outCursor out sys_refcursor)
is
v_sql varchar2(500);
begin
v_sql :='select empno, ename,sal from emp where deptno='||deptno;
dbms_output.put_line('SQL IS:'||v_sql);
open outCursor for v_sql;
exception when others then
dbms_output.put_line(sqlerrm);
end;
/
variable p_cursor REFCURSOR;
begin
emp_select(10,:p_cursor);
end;
/
print p_cursor;
在这个例子中说明两个地方:
sys_refcursor:是oracle9i预定义的一个系统cursor.和他对应的用法是在包头中定义,例如:
create or replace type t_emp as object{
empno emp.empno%type,
ename emp.ename%type,
sal emp.sal%type
};
type t_cursor is ref cursor return t_emp;(强引用游标)
type t_cursor if ref cursor;(弱引用游标)
REFCURSOR: ref cursor在sqlplus中的写法。