文章目录
游标
静态游标和动态游标
静态游标demo
动态游标demo
总结
游标
简述:存储过程代码中从表中检索出结果集进行操作交互。
静态游标和动态游标
静态游标:程序执行的时候不需要再去解析sql语言,对于sql语句的解析在编译的时候就可以完成
动态游标:含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成
测试表的BONUS1数据:
静态游标demo
静态游标:查询BONUS1表中的所有数据
这里可以看到sql写在定义游标的时候,编译时完成查询。
create or replace procedure curor is
cursor v_check_names is select ENAME from BONUS1;
v_ENAME BONUS1.ENAME%type;
begin
open v_check_names;
loop
fetch v_check_names into v_ENAME;
exit when v_check_names%notfound;
dbms_output.put_line(v_ENAME);
end loop;
close v_check_names;
end curor;
执行结果:
动态游标demo
动态游标:查询BONUS1表3行数据
这里可以看到动态游标会构造sql,带有参数。sql准备好以后再执行。
create or replace procedure curor is
type cur_get_index is ref cursor; --声明一个动态游标类型
v_cur_get_index cur_get_index; --声明一个动态游标变量
v_count number:=3;
v_ENAME varchar2(60);
v_JOB varchar2(60);
v_SAL varchar2(60);
v_COMM varchar2(60);
v_sql varchar2(60);
begin
v_sql := 'select * from BONUS1 where rownum <= '||v_count;
dbms_output.put_line('ENAME----JOB----SAL----COMM');
open v_cur_get_index for v_sql; -- 打开游标,并且SQL执行结果存放到游标
LOOP
fetch v_cur_get_index into v_ENAME,v_JOB,v_SAL,v_COMM;
exit when v_cur_get_index%notfound; -- 退出循环
dbms_output.put_line(v_ENAME||'----'||v_JOB||'----'||v_SAL||'----'||v_COMM);
END LOOP; -- 游标结束
end curor;
执行结果:
总结
静态游标:在定义的时候指明sql语句,编译时候执行。效率高。
动态游标:可以带有参数,编写sql处理各种复杂的业务场景。更灵活。
推荐博文:存储过程静态游标、隐式游标、显式游标、动态游标、游标遍历