ref cursor(参考游标,游标变量)
1.游标三种类型:
显式游标,隐式游标,参考游标(变量游标)
通用属性:
显式游标,参考游标 隐式游标
CURSOR_NAME%FOUND SQL%FOUND
CURSOR_NAME%NOTFOUND SQL%NOTFOUND
CURSOR_NAME%ISOPEN SQL%ISOPEN
CURSOR_NAME%ROWCOUNT SQL%ROWCOUNT
2.区别
oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的.它永远指向一个相同的查询工作区.
游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区.
显式游标(隐式游标)格式:
cursor cur_name [input_p,input_p2] [return ret_type]
is select_sentence;
#cur_name :定义游标名称
#input_p:输入参数【可选】,多个参数可用逗号区分。
参数格式:para_name [in] datatype[{:=|default}para_value]
#para_name:参数名称
#datatype:数据类型(不能指定具体长度,eg,不能varchar2(20),只能varchar2)
#:=或default:默认赋值符合
#para_value:默认赋值
eg:cursor cur_emp(var_job in varchar2:='SALESMAN')
is select * from emp where job=:var_job;
参数游标
第一种格式:
type type_cur_emp is ref cursor return emp%rowtype;
cur_emp type_cur_emp;
第二种格式:
type typ_result is record(ename emp.ename%type,sal emp.sal%type);
type typ_cur_strong is ref cursor return typ_result;
cur_emp typ_cur_strong;
(类同第一种方式)
第三种格式:
type typ_cur_weak is ref cursor;
cur_emp typ_cur_weak;
第四种格式:
cur_emp SYS_REFCURSOR;
3.举例:
#####OPEN FOR 不同表
DECLARE
TYPE typ_cur IS REF CURSOR;
cur_type typ_cur;
var_emp emp%ROWTYPE;
var_dept dept%ROWTYPE;
BEGIN
###两次连续open 后一次会覆盖前一次#######
OPEN cur_type FOR SELECT * FROM emp;
OPEN cur_type FOR SELECT * FROM dept;
FETCH cur_type INTO var_emp;
FETCH cur_type INTO var_dept;
/*
dbms_output.put_line(var_emp.job);---->此处放前会报错。
dbms_output.put_line(var_dept.loc);
*/
dbms_output.put_line(var_dept.loc);
dbms_output.put_line(var_emp.job);---->结果为空
CLOSE cur_type;
END;
/
OPEN FOR 相同表
#cur_type,cur_type2指向共同的结果集,后一次的fetch 会覆盖前一次fetch的值。
DECLARE
TYPE typ_cur IS REF CURSOR;
cur_type typ_cur;
cur_type2 typ_cur;
var_emp emp%ROWTYPE;
BEGIN
OPEN cur_type FOR SELECT * FROM emp;
cur_type2:=cur_type;
FETCH cur_type INTO var_emp;
FETCH cur_type2 INTO var_emp;
dbms_output.put_line(var_emp.empno);
dbms_output.put_line(var_emp.empno);
CLOSE cur_type;
FETCH cur_type2 into var_emp;
dbms_output.put_line(var_emp.empno);
END;
#批量导入 bulk collect
DECLARE
TYPE typ_cur IS REF CURSOR;
cur_type typ_cur;
type em_list is table of emp.empno%type;
var_emp em_list;
BEGIN
OPEN cur_type FOR SELECT empno FROM emp;
FETCH cur_type bulk collect INTO var_emp;
CLOSE cur_type;
for i in var_emp.first..var_emp.last
loop
dbms_output.put_line(var_emp(i));
end loop;
END;
1.游标三种类型:
显式游标,隐式游标,参考游标(变量游标)
通用属性:
显式游标,参考游标 隐式游标
CURSOR_NAME%FOUND SQL%FOUND
CURSOR_NAME%NOTFOUND SQL%NOTFOUND
CURSOR_NAME%ISOPEN SQL%ISOPEN
CURSOR_NAME%ROWCOUNT SQL%ROWCOUNT
2.区别
oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的.它永远指向一个相同的查询工作区.
游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区.
显式游标(隐式游标)格式:
cursor cur_name [input_p,input_p2] [return ret_type]
is select_sentence;
#cur_name :定义游标名称
#input_p:输入参数【可选】,多个参数可用逗号区分。
参数格式:para_name [in] datatype[{:=|default}para_value]
#para_name:参数名称
#datatype:数据类型(不能指定具体长度,eg,不能varchar2(20),只能varchar2)
#:=或default:默认赋值符合
#para_value:默认赋值
eg:cursor cur_emp(var_job in varchar2:='SALESMAN')
is select * from emp where job=:var_job;
参数游标
第一种格式:
type type_cur_emp is ref cursor return emp%rowtype;
cur_emp type_cur_emp;
第二种格式:
type typ_result is record(ename emp.ename%type,sal emp.sal%type);
type typ_cur_strong is ref cursor return typ_result;
cur_emp typ_cur_strong;
(类同第一种方式)
第三种格式:
type typ_cur_weak is ref cursor;
cur_emp typ_cur_weak;
第四种格式:
cur_emp SYS_REFCURSOR;
3.举例:
#####OPEN FOR 不同表
DECLARE
TYPE typ_cur IS REF CURSOR;
cur_type typ_cur;
var_emp emp%ROWTYPE;
var_dept dept%ROWTYPE;
BEGIN
###两次连续open 后一次会覆盖前一次#######
OPEN cur_type FOR SELECT * FROM emp;
OPEN cur_type FOR SELECT * FROM dept;
FETCH cur_type INTO var_emp;
FETCH cur_type INTO var_dept;
/*
dbms_output.put_line(var_emp.job);---->此处放前会报错。
dbms_output.put_line(var_dept.loc);
*/
dbms_output.put_line(var_dept.loc);
dbms_output.put_line(var_emp.job);---->结果为空
CLOSE cur_type;
END;
/
OPEN FOR 相同表
#cur_type,cur_type2指向共同的结果集,后一次的fetch 会覆盖前一次fetch的值。
DECLARE
TYPE typ_cur IS REF CURSOR;
cur_type typ_cur;
cur_type2 typ_cur;
var_emp emp%ROWTYPE;
BEGIN
OPEN cur_type FOR SELECT * FROM emp;
cur_type2:=cur_type;
FETCH cur_type INTO var_emp;
FETCH cur_type2 INTO var_emp;
dbms_output.put_line(var_emp.empno);
dbms_output.put_line(var_emp.empno);
CLOSE cur_type;
FETCH cur_type2 into var_emp;
dbms_output.put_line(var_emp.empno);
END;
#批量导入 bulk collect
DECLARE
TYPE typ_cur IS REF CURSOR;
cur_type typ_cur;
type em_list is table of emp.empno%type;
var_emp em_list;
BEGIN
OPEN cur_type FOR SELECT empno FROM emp;
FETCH cur_type bulk collect INTO var_emp;
CLOSE cur_type;
for i in var_emp.first..var_emp.last
loop
dbms_output.put_line(var_emp(i));
end loop;
END;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29665458/viewspace-1221185/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29665458/viewspace-1221185/