SQL笔记 第五章

---- 第五章 PL/SQL游标 ----

1. 游标(CURSOR)
 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数
 据指针,在初始状态下指向的是首记录,利用 fetch 语句可以移动该指针,从而对游标中的数
 据进行各种操作,然后将操作结果写回数据表中。
 1)分类:  a)显式游标:程序员可以操作控制,是针对select 语句的,指向select 语句的结束集
   b)隐式游标:程序员不可控制,但可以有限制的应用
 2)作用:用于处理查询语句的结果,提取多行数据集;
 3)使用步骤:
  a) 声明游标:
   a. 普通申明: DELCARE
       v_emp s_emp%ROWTYPE;
       v_did s_dept.id%TYPE;
       CURSOR cur_emp IS select * FROM s_emp WHERE dept_id =v_did; 
       /* CURSOR的内容必须是一条查询语句 */
   b. 带参数申明:DELCARE    
         CURSOR c_emp(v_did s_emp.ID%TYPE) SELECT * FROM s_emp WHERE dept_id = v_did;
  b) 为查询打开游标:
   OPEN cur_emp;  /* 相当于执行select语句,且把执行结果存入CURSOR;
  c) 从游标中取结果,存入PL/SQL变量中:
   a. FETCH cur_emp INTO var1, var2, ...(变量名 1, 变量名 2,.......);  /* 变量的数量、类型、顺序要和Table中字段一致; */
   b. FETCH cur_emp INTO record_var(记录型变量名);
   注:将值从CURSOR取出放入变量中,每FETCH一次取一条记录;
  d) 关闭游标:
   CLOSE cur_emp;
  注:a. 游标使用后应该关闭;
   b. 关闭后的游标不能FETCH和再次CLOSE;
   c. 关闭游标相当于将内存中CURSOR的内容清空;

2. 游标的属性
 游标名%属性名
 1) %FOUND: 是否有值; 有则返回TRUE,否则返回FALSE;
 2) %NOTFOUND: 是否没有值; 如果没有值则返回TRUE,否则返回FALSE;
 3) %ISOPEN: 是否是处于打开状态; 处于打开状态就返回TRUE,否则返回FALSE;
 4) %ROWCOUNT: CURSOR当前的记录号(当前游标的指针位移量,表示在此之前,游标所处理的数据量(多少条记录));

3. 游标的FETCH循环
 1)  LOOP FETCH 游标名 INTO 定义的变量
   EXIT WHEN 游标名%NOTFOUND; /* 当游标没取道记录后退出 要及时的做出判断 */
  END LOOP;
 2)  WHILE 游标名%FOUND LOOP FETCH 游标名 INTO 定义的变量;
  END LOOP;
 3)  FOR 保存数据的变量(不用事先定义,是根据游标声明的时候SELECT 的类型来确定)
  IN 游标名 LOOP (FETCH 游标名 INTO ...)
  (可以不用FETCH 语句)
  END LOOP;

4.带参数的游标CURSOR
 DECLARE
  v_emp s_emp%ROWTYPE
  CURSOR cur_emp(p_did  s_emp.dept_id%TYPE) IS  /* 定义参数p_did的类型 */
   SELECT * FROM s_emp WHERE dept_id= p_did
   FOR UPDATE OF salary;  /*FOR UPDATE OF salary; 加行级锁,在我修改这些数据的时候,
         *其他人无法修改数据,直到游标被CLOSE后 */
 BEGIN
  OPEN cur_emp(31);  /*带的参数值 31 就是赋给参数p_did 的 */ 
  LOOP
   FETCH cur_emp INTO v_emp;
   EXIT WHEN cur_emp%NOTFOUND;

   DBMS_OUTPUT.PUT_LINE(v_emp.id||'  '||v_emp.first_name);
  END LOOP;
  CLOSE cur_emp;
 END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值