oracle for loop循环以及游标循环

1. for in loop形式

  DECLARE
     CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salary
     FROM employees ;
  BEGIN
     --隐含打开游标
     FOR v_sal IN c_sal LOOP
     --隐含执行一个FETCH语句
        DBMS_OUTPUT.PUT_LINE(to_char(v_sal.employee_id)||‘---‘|| v_sal.ename||‘---‘||to_char(v_sal.salary)) ;
     --隐含监测c_sal%NOTFOUND
     END LOOP;
  --隐含关闭游标
  END;

2.普通的游标循环

  declare

  --定义游标并且赋值(is 不能和cursor分开使用)

  cursor stus_cur is select * from students;

  --定义rowtype

  cur_stu students%rowtype;

  /*开始执行*/

  begin

  --开启游标

  open stus_cur;

   --loop循环

   loop

   --循环条件

   exit when stus_cur%notfound;

   --游标值赋值到rowtype

   fetch stus_cur into cur_stu;

   --输出

   dbms_output.put_line(cur_stu.name);

   --结束循环

   end loop;

  --关闭游标

  close stus_cur;

  /*结束执行*/

 end;

3.高效的游标循环

  declare

  cursor myemp_cur

  is select * from myemp;

  type myemp_tab is table of myemp%rowtype;

  myemp_rd myemp_tab;

  begin

   open myemp_cur;

   loop

   fetch myemp_cur bulk collect into myemp_rd limit 20;

   for i in 1..myemp_rd.count loop

    dbms_output.put_line(‘姓名:‘||myemp_rd(i).ename);

   end loop;

   exit when myemp_cur%notfound;

   end loop;

  end;

BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎。通常可以在SELECT INTO、
FETCH INTO以及RETURNING INTO子句中使用BULK COLLECT.

BULK COLLECT的限制
1、不能对使用字符串类型作键的关联数组使用BULK COLLECT 子句。
2、只能在服务器端的程序中使用BULK COLLECT,如果在客户端使用,就会产生一个不支持这个特性的错误。
3、BULK COLLECT INTO 的目标对象必须是集合类型。
4、复合目标(如对象类型)不能在RETURNING INTO 子句中使用。
5、如果有多个隐式的数据类型转换的情况存在,多重复合目标就不能在BULK COLLECT INTO 子句中使用。
6、如果有一个隐式的数据类型转换,复合目标的集合(如对象类型集合)就不能用于BULK COLLECTINTO 子句中。

时间: 2024-11-07 22:08:20

oracle for loop循环以及游标循环的相关文章

sqlserver中的循环遍历(普通循环和游标循环)

sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student 2.普通循环 1)循环5次来修改学生表信息 --循环遍历修改记录--declare @i int   set @i=0while @i<5begin    update Student set demo = @i+5 where [email protected]    set @[email protected] +1 end--查看结果--select * from Student 2)执行后的查

SQL SERVER循环遍历(普通循环和游标循环)

1.首先需要一个测试表数据Student 2.普通循环 1)循环5次来修改学生表信息 --循环遍历修改记录--declare @i int   set @i=0while @i<5begin    update Student set demo = @i+5 where [email protected]    set @[email protected] +1 end--查看结果--select * from Student 2)执行后的查询结果 3.游标循环(没有事务) 1)根据学生表实际数

sql 循环语句几种方式(变量循环,游标循环,事务)

--第一 declare @orderNum varchar(255) create table #ttableName(id int identity(1,1),Orders varchar(255)) declare @n int,@rows int insert #ttableName(orders) select orderNum from FOrders where orderId<50 --select @rows=count(1) from pe_Orders select @ro

oracle学习-PL SQL 存储过程中循环、触发器

PL SPL 提供了3中不同类型的循环结构 -- 实例:索引 loop_counter从1开始,到10 结束,循环共执行10次 FOR loop_counter IN 1 .. 10 LOOP ...可执行语句... END LOOP; -- 索引loop_counter从10开始,到1结束,循环共执行10次: FOR loop_counter IN REVERSE 1 .. 10 LOOP ...可执行语句... END LOOP; -- 循环的执行范围取决于变量或者表达式的值: FOR ca

Oracle游标循环更新数据案例

declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZJZJRQ AS ZJZJZJRQ FROM XTXMXX XT, QJGLXX_ZQL_MID QJ WHERE XT.XTXMBH = QJ.XTXMBH AND XT.XTXMCLRQ >= '20120630' AND (QJ.ZJQHZJRQ IS NULL OR QJ.ZJZJZJRQ

Oracle游标-循环查询表中数据(表名),并执行

Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount varchar2(100); --定义一个游标变量 cursor c_job is --查询该表中的所有表名 select tablename from tbname; c_row c_job%rowtype; begin --循环待处理数据,即以上查出的结果集 for c_row in c_job loop ---执行语句 from

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

ORACLE游标循环【转】

ORACLE游标循环有几种用法,下面分别介绍一下. 首先定义游标和变量 CURSOR C1 IS SELECT  eNAME,ejob FROM emp WHERE deptno=10; v_NAME VARCHAR2(10); v_job VARCHAR2(10); 第一种:使用loop 循环 open c1; loop fetch c1 into v_name,v_job ; exit when c1%notfound; …… end loop colse c1; 这里需要注意,exit w

Oracle,跳出游标循环

1,跳出游标的循环,不执行遍历了. 方法一:goto for c_row in 游标 loop if 条件 then dbms_output.put_line('测试跳出循环'); goto breakLoop; end if; end loop; <<breakLoop>> 首先在循环外面定义一个:<<方法名>>.这里的方法名可以随便起,作用就是给跳出循环后的位置定位. 然后使用:goto  方法名.在满足一定条件后就会跳出循环,到方法名那里. 方法二:E