Oracle之静态游标与动态游标

游标

简述:存储过程代码中从表中检索出结果集进行操作交互。

静态游标和动态游标

静态游标:程序执行的时候不需要再去解析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处理各种复杂的业务场景。更灵活。

推荐博文:存储过程静态游标、隐式游标、显式游标、动态游标、游标遍历

猜你喜欢

转载自blog.csdn.net/qq_38425803/article/details/107822871
今日推荐