oracle有集合为什么要用游标,oracle 游标使用
游标:
用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标。
要在程序中使用游标,必须首先声明游标分类:
1、静态游标:显式游标和隐式游标。
2、REF游标:是一种引用类型,类似于指针。
其中,ref游标和普通游标(自定义游标)最大的区别是游标的结果集在什么地获取,普通游标在声明的时候,获得结果集,例子 cursor v_cur is select * from t_test;而ref游标在打开的时候,获得结果集
一、隐式游标:
1.定义
隐式游标则由则由系统自动定义,非显示定义游标的DML语句即被赋予隐式游标属性。其过程由oracle控制,完全自动化。隐式游标
的名称是SQL,不能对SQL游标显式地执行OPEN,FETCH,CLOSE语句。
2.属性
类似于显示游标,隐式游标同样具有四种属性,只不过隐式游标以SQL%开头,而显示游标以Cursor_name%开头
通过SQL%总是只能访问前一个DML操作或单行SELECT操作的游标属性,用于判断DML执行的状态和结果,进而控制程序的流程
SQL%ISOPEN
游标是否打开。当执行select into ,insert update,delete时,Oracle会隐含地打开游标,且在该语句执行完毕或隐含地关闭
游标,因为是隐式游标,故SQL%ISOPEN总是false
SQL%FOUND
判断SQL语句是否成功执行。当有作用行时则成功执行为true,否则为false。
SQL%NOTFOUND
判断SQL语句是否成功执行。当有作用行时否其值为false,否则其值为true。
SQL%ROWCOUNT
在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为,如果没有
成功,SQL%ROWCOUNT的值为,同时产生一个异常NO_DATA_FOUND。
列如:
for v_aa in aaa_cursor loop
end loop;
这样就完成了一次隐式游标的调用,可以看到此种方式类似于高级语言的for循环。
二、显示游标
用户自定义游标,专门用于处理select语句返回的多行数据
-- 声明游标;CURSOR cursor_name IS select_statement
-- 语法:
CURSOR cursor_name [ ( [parameter [,parameter...] ) ] [RETURN return_specification]
IS
SELECT_statement
显示游标的过程描述:
1.声明游标
CURSOR cursor_name IS select_statement
如:CURSOR emp_cur IS SELECT empno,ename,job,sal FROM scott.emp;
2.打开游标
OPEN cursor_name --打开游标则执行对应的select语句,将对应的结果集存放到游标当中
如:OPEN emp_cur
3.读取数据
FETCH cursor_name INTO var_name1,...var_name2 ; --提取单行数据,需要配合循环语句来使用
FETCH cursor_name BULK COLLECT INTO collect1,collect2,...[LIMIT rows]; --提取多行数据,collect为集合变量
4.关闭游标
CLOSE cursor_name
5.显示游标的个属性
cursor_name%ISOPEN 游标是否打开
cursor_name%FOUND 最近的FETCH是否提取到数据
cursor_name%NOTFOUND 最近的FETCH是否没有提取到数据
cursor_name%ROWCOUNT 返回到目前为止,已经从游标缓冲区中提取到数据的行数
然而在某些情况下显式游标使用起来会更加灵活。在隐式游标的for语句调用中,类似for语句,在取不到下条记录的情况下,不会进入循环体而会直接退出。这在某些情况下会造成一些不便,比如在无更多数据时应对最后一组数据进行处理再退出。此时显式游标以aaa_cursor%notfound条件判定再退出的形式就会有用的多,可以在循环体内根据aaa_curso r%notfound的条件手动控制退出的时机,进行最后一次处理。
案例
显示游标案例
1、For 循环游标
(1)定义游标
(2)定义游标变量
(3)使用for循环来使用这个游标
declare
--类型定义
cursor c_test
is
select user_code,user_name,user_password
from sm_user
where user_code='qinhao';
--定义一个游标变量c_test_row c_test%ROWTYPE ,该类型为游标c_test中的一行数据类型
c_test_row c_test%rowtype;
begin
for c_test_row in c_test loop
dbms_output.put_line(c_test_row.user_code||'-'||c_test_row.user_name||'-'||c_test_row.user_password);
end loop;
end;
--运行结果
SQL> declare
2 --类型定义
3 cursor c_test
4 is
5 select user_code,user_name,user_password
6 from sm_user
7 where user_code='qinhao';
8 --定义一个游标变量c_test_row c_test%ROWTYPE ,该类型为游标c_test中的一行数据类型
9 c_test_row c_test%rowtype;
10 begin
11 for c_test_row in c_test loop
12 dbms_output.put_line(c_test_row.user_code||'-'||c_test_row.user_name||'-'||c_test_row.user_password);
13 end loop;
14 end;
15 /
qinhao-秦豪-hnmflgjihljmobge
PL/SQL procedure successfully completed
--Fetch游标
--使用的时候必须要明确的打开和关闭
declare
--类型定义
cursor c_test
is
select user_code,user_name,user_password
from sm_user
where user_code='limin';
--定义一个游标变量c_test_row c_test%ROWTYPE ,该类型为游标c_test中的一行数据类型
c_test_row c_test%rowtype;
begin
open c_test;
loop
--提取一行数据到c_test_row
fetch c_test into c_test_row;
--判读是否提取到值,没取到值就退出
--取到值c_test%notfound 是false
--取不到值c_test%notfound 是true
exit when c_test%notfound;
dbms_output.put_line(c_test_row.user_code||'-'||c_test_row.user_name||'-'||c_test_row.user_password);
end loop;
--关闭游标
close c_test;
end;
--运行结果
SQL> declare
2 --类型定义
3 cursor c_test
4 is
5 select user_code,user_name,user_password
6 from sm_user
7 where user_code='limin';
8 --定义一个游标变量c_test_row c_test%ROWTYPE ,该类型为游标c_test中的一行数据类型
9 c_test_row c_test%rowtype;
10 begin
11 open c_test;
12 loop
13 --提取一行数据到c_test_row
14 fetch c_test into c_test_row;
15 --判读是否提取到值,没取到值就退出
16 --取到值c_test%notfound 是false
17 --取不到值c_test%notfound 是true
18 exit when c_test%notfound;
19 dbms_output.put_line(c_test_row.user_code||'-'||c_test_row.user_name||'-'||c_test_row.user_password);
20 end loop;
21 --关闭游标
22 close c_test;
23 end;
24 /
limin-李敏-lodepcfhagbgaemb
PL/SQL procedure successfully completed
隐式游标案例
任意执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况。
begin
update zjl set USER_NAME='ALEARK' WHERE USER_CODE='qinhao';
if sql%isopen then
dbms_output.put_line('Openging');
else
dbms_output.put_line('closing');
end if;
if sql%found then
dbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行
else
dbms_output.put_line('Sorry');
end if;
if sql%notfound then
dbms_output.put_line('Also Sorry');
else
dbms_output.put_line('Haha');
end if;
dbms_output.put_line(sql%rowcount);
exception
when no_data_found then
dbms_output.put_line('Sorry No data');
when too_many_rows then
dbms_output.put_line('Too Many rows');
end;
(整理自网络,并亲自实验记录)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28918446/viewspace-1065047/,如需转载,请注明出处,否则将追究法律责任。
oracle有集合为什么要用游标,oracle 游标使用相关推荐
- oracle创建多个游标,Oracle——游标的创建和使用
游标 SQL语言是面向集合的,是对指定列的操作.如果要对列中的指定行进行操作,就必须使用游标. 当在PL/SQL块中执行查询语句(SELECT) 和数据操纵语句(DML) 时,Oracle会为其分配一 ...
- oracle的集合操作符,[Oracle] Oracle的集合操作符
Oracle的集合操作包括: union , intersect , minus. [例子] 假设有两个表a,b如下: SQL> select * from a; COLA ---------- ...
- oracle中创建游标,oracle 存储过程创建游标
Oracle与Sql Server差异点详解 1.create函数或存储过程异同点 Oracle 创建函数或存储过程一般是 create or replace -- SQL SERVER 则是在创建之 ...
- oracle 如何创建游标,Oracle--plsql游标创建和使用
Oracle--plsql游标创建和使用 为什么要游标: 先看这个: DECLARE v_empno emp.empno%type; v_ename emp.ename%type; BEGIN SEL ...
- oracle12c清理游标,Oracle专题12之游标
示例:按职工的职称涨工资,总裁涨1000元,经理涨500元,其他员工涨300元. DECLARE --定义游标 CURSOR emp01_cursor IS SELECT empno, job FRO ...
- oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...
1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...
- oracle 存储过程 begin end,存储过程定义多个游标多个begin,存储过程begin
存储过程定义多个游标多个begin,存储过程begin 1.直接定义多个显示游标 CREATE OR REPLACE PROCEDURE ACC.DBP_REALCITYTRAFFICCNT IS C ...
- oracle 记录给游标,Oracle游标 CURSOR实例详解
一.游标概述: 游标(cursor)是数据库系统在内存中开设的一个数据缓冲区,存放SQL语句的执行结果. 每个游标都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给变量做进一步处理. 作用 ...
- oracle union all写法,【oracle】-集合运算:UNION,UNION ALL...
在Oracle中提供了三种类型的集合操作: 并(UNION).交(INTERSECT).差(MINUS) UNION:求并,重复记录只显示一次. UNION ALL:求并集,显示所有记录信息. INT ...
最新文章
- vue v-for 不能自能渲染问题
- 牛客题霸 [括号序列] C++题解/答案
- 亚马逊 各国站点 链接_使用Amazon S3和HTTPS的简单站点托管
- Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法1 - 条件判断法
- cass或cad里提取点坐标及高程的插件_一个坐标计算小程序 EXCEL 可以进行抵偿任意带高斯坐标转换...
- Python动态导入模块、类
- cdn.cdzk_页面“www.cdzkdc.com”HTTP状态检测结果- 站长工具
- 为什么强化学习会成为当下超火的研究领域?
- 傻傻分不清之 Cookie、Session、Token、JWT这次让你彻底搞懂,还不懂你来找我
- jQuery、layer实现弹出层的打开、关闭功能实例详解
- 技术规范,过几天发个压缩包,一次下载全部拥有
- Flink的State与Rescale
- 导出excel 手动拼装复杂表头
- python技巧积累
- C# - 音乐小闹钟_BetaV1.0
- SAP学习笔记(SD的Delivery) 2008-12-28
- 苹果微信换行怎么打_微信朋友圈发长文被折叠成一行怎么破?附苹果安卓解决方案...
- Unity tips 之文字动画效果
- 读《计算机科学概论》
- 【胖张】献给跟我一样的菜鸟