PL/SQL学习(三)游标
|
属性
|
返回类型 |
例子 |
|
%FOUND |
至少一条记录受影响(或者返回)时返回TRUE |
SQL%FOUND |
|
没有记录受影响(或者返回)时返回FALSE |
||
|
%NOTFOUND |
没有记录受影响(或者返回)时返回TRUE |
SQL%NOTFOUND |
|
至少一条记录受影响(或者返回)时返回FALSE |
||
|
%ROWCOUNT |
返回受影响的记录条数 |
SQL%ROWCOUNT |
例子:
DECLARE var_rows number(5);
BEGIN
UPDATE employee
SET salary = salary + 1000;
IF SQL%NOTFOUND THEN
dbms_output.put_line('None of the salaries where updated');
ELSIF SQL%FOUND THEN
var_rows := SQL%ROWCOUNT;
dbms_output.put_line('Salaries for ' || var_rows || 'employees are updated');
END IF;
END;
显式游标
创建格式:
CURSOR cursor_name IS select_statement;
使用:
|
1) 声明游标:
DECLARE
CURSOR cursor_name IS
返回多条记录的SELECT语句;
2) 打开游标:
OPEN cursor_name;
3) 取数据放到PL/SQL变量或者记录里:
FETCH cursor_name INTO record_name;
FETCH cursor_name INTO variable_list;
4) 关闭游标:
CLOSE cursor_name;
5)注意:
当取数据(数据库里一行记录)存到记录里面时,记录和游标的数据结构必须一致。
当取数据(数据库里一行记录)存到多个变量里时,变量的顺序和游标列的顺序一致。
游标打开后,第一行被指定为当前行,每当数据被取到变量或者记录里,游标指向下一行。
试图打开一个在前面操作中没有关闭的游标,程序会报错。
当游标移到最后一行记录的后面,再取数据时,程序会报错。
例子:
1> DECLARE
2> emp_rec emp_tbl%rowtype;
3> CURSOR emp_cur IS
4> SELECT *
5> FROM emp_tbl
6> WHERE salary > 10;
7> BEGIN
8> OPEN emp_cur;
9> FETCH emp_cur INTO emp_rec;
10> dbms_output.put_line (emp_rec.first_name || ' ' || emp_rec.last_name);
11> CLOSE emp_cur;
12> END;
显式游标属性:
|
属性 |
返回值 |
例子 |
|
%FOUND |
至少获取一条数据时返回TRUE |
Cursor_name%FOUND |
| 没有获取到数据时返回FALSE | ||
|
%NOTFOUND |
没有获取到数据时返回TRUE | Cursor_name%NOTFOUND |
| 至少获取一条数据时返回FALSE | ||
|
%ROWCOUNT |
获取到的数据条数 |
Cursor_name%ROWCOUNT |
| 没有取到数据时,报错 | ||
|
%ISOPEN |
游标打开时返回TRUE |
Cursor_name%ISNAME |
| 游标关闭时返回FALSE |
使用简单循环:
1> DECLARE
2> CURSOR emp_cur IS
3> SELECT first_name, last_name, salary FROM emp_tbl;
4> emp_rec emp_cur%rowtype;
5> BEGIN
6> IF NOT emp_cur%ISOPEN THEN
7> OPEN emp_cur;
8> END IF;
9> LOOP
10> FETCH emp_cur INTO emp_rec;
11> EXIT WHEN emp_cur%NOTFOUND;
12> dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name
13> || ' ' ||emp_cur.salary);
14> END LOOP;
15> END;
16> /
使用While循环:
9> FETCH sales_cur INTO sales_rec;
10> WHILE sales_cur%FOUND THEN
11> LOOP
12> dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name
13> || ' ' ||emp_cur.salary);
15> FETCH sales_cur INTO sales_rec;
16> END LOOP;
使用FOR循环:
1> DECLARE
2> CURSOR emp_cur IS
3> SELECT first_name, last_name, salary FROM emp_tbl;
4> emp_rec emp_cur%rowtype;
5> BEGIN
6> FOR emp_rec in sales_cur
7> LOOP
8> dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name
9> || ' ' ||emp_cur.salary);
10> END LOOP;
11>END;
12> /
带参数游标
格式:CURSOR cursor_name(parameter_name1 type1,parameter_name2 datetype type2..) IS select_statement;
例子:
1)定义
CURSOR c_emp(no IN emp.empno%TYPE) --或者(no NUMBER)
IS
SELECT * FROM emp
WHERE
empno = no; 2)使用
OPEN c_emp('no1')
FOR r_emp IN c_emp('no1') LOOP...
使用FOR UPDATE 和 WHERE CURRENT的游标
以下内容摘自《Oracle PL/SQL by Example》
使用FOR UPDATE 和 WHERE CURRENT的游标:
FOR UPDATE 能锁定希望更新的行,commit或者rollback 后才会释放锁
没有commit或者rollback时可以在游标中使用WHERE CURRENT OF 检索最新的数据。
使用:
在游标定义结尾处加上
FOR UPDATE [OF item_name]
例子:
1)
DECLARE
CURSOR c_course IS
SELECT course_no,cost
FROM course FOR UPDATE [OF cost];
BEGIN
FOR r_course IN c_course
LOOP
IF r_course.cost < 2500
THEN
UPDATE course
SET cost = r_course.cost + 10
WHERE course_no = r_course.course_no;
END IF;
END LOOP;
END;
2) 使用WHERE CURRENT OF子句,可以不用在UPDATE语句中添加对应的WHERE条件
DECLARE
CURSOR c_course IS
SELECT course_no,cost
FROM course
WHERE cost < 2500
FOR UPDATE [OF cost];
BEGIN
FOR r_course IN c_course
LOOP
UPDATE course
SET cost = r_course.cost + 10
WHERE CURRENT OF c_course;
END LOOP;
END;
PL/SQL学习(三)游标的更多相关文章
- PL/SQL学习笔记之游标
一:游标 Oracle会创建一个上下文区域,用于处理SQL语句,其中包含需要处理的语句.处理结果等等. 游标指向这一上下文的区域. PL/SQL通过控制游标在上下文区域移动,来获取SQL语句的结果信息 ...
- PL/SQL -->隐式游标(SQL%FOUND)
PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- PL/SQL学习笔记_02_游标
在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现. 为了处理 SQL 语句, ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处 ...
- PL/SQL学习笔记(三)
-----创建一个序列,再创建一个表(主键是数字),通过序列生成该表的主键值. create table mytb1( m_id number primary key, m_name ) not nu ...
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- 五、PL/SQL循环、游标、函数和过程
--PL/SQL基础知识学习 --一.PL/SQL语句块,基础语法格式 DECLARE --变量声明列表 info varchar(25); --变量声明 stu_unm integer := 15; ...
- [Oracle] PL/SQL学习笔记
-- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...
- PL/SQL — 显式游标
一.游标的相关概念及特性 1.定义 通过游标方式定位到结果集中某个特定的行,然后根据业务需求对该行进行相应特定的操作. 2.分类 显示游标: 用户自定义游标,用于处理select语句返回的多行数据. ...
随机推荐
- php数组相加 两个数组键名相同 后者不能覆盖前者
array(“a”)+array(“b”)结果还是array(“a”) array(“a”)+array(“b”)的结果是 array(“a”) 因为,它们等效于array(“0″=>”a”)+ ...
- php排序之快速排序
关于快速排序的介绍 请看百度百科讲解的很详细 http://baike.baidu.com/link?url=1VOpp4qjdwKma81MFPozjvyPy2rYJos6ZmfP5Ady3xjEP ...
- Windows7 64位机上Emgu CV2.4.2安装与配置
Windows7 64位机上Emgu CV2.4.2安装与配置 分类: Emgu CV 2012-11-28 17:22 92 ...
- UVa 497 - Strategic Defense Initiative
题目:最大上升子序列.输出一组解. 分析:dp,LIS.数据较小 O(n^2)算法就可以. 设以第i个数字作为最大上升子序列中的最后一个数的长度为 f(i),则有转移方程: f(i)= max(f(j ...
- 如何停止IIS
当一台计算机同时安装了IIS服务器和apache服务器的时候,需要运行其中的一个服务器就需要将另一个服务器停止,那么如何停止IIS服务器: 双击[world wide web publishing s ...
- 对Jsp提交input标签空格和回车的处理
今天做增加的时候发现一个问题,在js中去掉空格的时候如果这么写 var stage_name = document.getElementById("stage_name").val ...
- TCP并发server,每个客户一个子进程
今天笔者带来的是server型号第一,这是最经常使用的模型的最基本的一个–TCP并发server,每个客户一个子进程. 首先简单介绍:TCP并发server,每个客户一个子进程,并发server调用f ...
- careercup-树与图 4.1
4.1 实现一个函数,检查二叉树是否平衡.在这个问题中,平衡树的定义如下:任意一个结点,其两颗子树的高度差不超过1. C++实现代码: #include<iostream> #includ ...
- 进程环境之setjmp和longjmp函数
在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...
- c++ 数据持久层研究(一)
C++ORM框架自动生成代码数据库 用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...