plsql--游标用法
1.游标概念
在 PL/SQL 块中执行 SELECT、INSERT、DELETE 和 UPDATE 语句时,ORACLE 会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或
是命名一个工作区(Work Area),或是一种结构化数据类型。它为应用等量齐观提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式
SQL 语句的应用程序的常用编程方式。
在每个用户会话中,可以同时打开多个游标,其数量由数据库初始化参数文件中的
OPEN_CURSORS 参数定义。
对于不同的 SQL 语句,游标的使用情况不同:
非查询语句--》 隐式的
结果是单行的查询语句 --》隐式的或显示的
结果是多行的查询语句--》 显示的
2.处理显示游标
2.1显示游标处理的4个步骤
1.定义/ / 声明 游标:就是定义一个游标名,以及与其相对应的 SELECT 语句。
格式:
CURSOR cursor_name[(parameter[, parameter]…)]
[RETURN datatype]
IS
select_statement;
注意:1.游标参数只能为输入参数
2.在指定数据类型时,不能使用长度约束
3.[RETURN datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与 select_statement 中的选择列表在次序和数据类型上匹配。一般是记录数据类型或带“%ROWTYPE”的数据。
2.打开游标
就是执行游标所对应的 SELECT 语句,将其查询结果放入工作区,并且指
针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有 FOR UPDATE 选
项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。
格式:OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
3.提取游标
就是检索结果集合中的数据行,放入指定的输出变量中。
格式:FETCH cursor_name INTO {variable_list | record_variable };
执行 FETCH 语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。当
检索到最后一行数据时,如果再次执行 FETCH 语句,将操作失败,并将游标属性
%NOTFOUND 置为 TRUE。所以每次执行完 FETCH 语句后,检查游标属性%NOTFOUND
就可以判断 FETCH 语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了
值。
4.关闭游标
当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占
用的系统资源,并使该游标的工作区变成无效,不能再使用 FETCH 语句取其中数据。
关闭后的游标可以使用 OPEN 语句重新打开。
格式:CLOSE cursor_name;
注意:定义的游标不能有 INTO 子句。
游标属性
游标属性 属性作用
Cursor_name%FOUND 布尔型属性,当最近一次提取游标操作 FETCH成功则为 TRUE,否则为 FALSE;
Cursor_name%NOTFOUND 布尔型属性,与%FOUND 相反;
Cursor_name%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;
Cursor_name%ROWCOUNT 数字型属性,返回已从游标中读取的记录数。
2.2使用案例
--普通游标
declare
cursor emp_cursor1 is
select ename,sal from emp where sal < 1000;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor1;
loop
fetch emp_cursor1
into v_name,v_sal;
exit when emp_cursor1%notfound;
dbms_output.put_line(v_name || '---' || v_sal);
--dbms_output.put_line('isOpen:'||emp_cursor1%isopen); --查看游标状态
end loop;
close emp_cursor1;
end;
--游标传参
declare
cursor emp_cursor2(cursor_sal number default 2000) is --(此处的参数是默认参数,后面可以重新设置,此默认值失效)
select ename,sal from emp where sal >= cursor_sal;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor2(cursor_sal=>3000); --(重新设置参数值)
loop
fetch emp_cursor2
into v_name,v_sal;
exit when emp_cursor2%notfound;
dbms_output.put_line(v_name || '---' || v_sal);
end loop;
dbms_output.put_line('rowcount:'||emp_cursor2%rowcount); --(游标记录数)
close emp_cursor2;
end;
--if...then(给工资低于2000的员工加薪1元)
declare
cursor emp_cursor3 is
select ename, sal, empno from emp;
v_no emp.empno%type;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open emp_cursor3;
loop
fetch emp_cursor3
into v_name, v_sal, v_no;
exit when emp_cursor3%notfound;
if v_sal <= 2000 then
update emp set sal = sal + 1 where empno = v_no;
dbms_output.put_line(v_name || '---' || v_sal);
end if;
end loop;
dbms_output.put_line('rowcount:' || emp_cursor3%rowcount);
close emp_cursor3;
end;
--有参数有返回值的游标(记录类型)
declare
type emp_record_type is record(
v_no emp.empno%type,
v_name emp.ename%type,
v_sal emp.sal%type);
v_emp_record emp_record_type;
cursor emp_cursor4(dept_no number) return emp_record_type is
select empno, ename, sal from emp where deptno = dept_no;
begin
open emp_cursor4(dept_no=>20);
loop
fetch emp_cursor4
into v_emp_record;
if emp_cursor4%found then
dbms_output.put_line(v_emp_record.v_name || '---' ||
v_emp_record.v_sal);
else
dbms_output.put_line('已经处理完结果集');
exit;
end if;
end loop;
close emp_cursor4;
end;
--for循环格式游标
declare
cursor emp_cursor5 is
select ename, sal from emp;
begin
for v_sal in emp_cursor5 loop
dbms_output.put_line(v_sal.ename || '--***--' || v_sal.sal);
end loop;
end;
--for循环格式游标带参数
declare
cursor emp_cursor5(dept_no number) is
select ename, sal from emp where deptno=dept_no;
begin
for v_sal in emp_cursor5(30) loop
dbms_output.put_line(v_sal.ename || '--***--' || v_sal.sal);
end loop;
end;
--for循环子查询方式游标
begin
for v_sal in (select ename, sal from emp where deptno=20) loop
dbms_output.put_line(v_sal.ename || '--***--' || v_sal.sal);
end loop;
end;
3.处理隐式游标
显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对
于非查询语句,如修改、删除操作,则由 ORACLE 系统自动地为这些操作设置游标并创建
其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为 SQL,这是由
ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由 ORACLE
系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操
作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的
一条 SQL 语句所包含的数据。
格式调用为: SQL%
隐式游标属性
属性 值 SELECT INSERT UPDATE DELETE
SQL%ISOPEN FALSE FALSE FALSE FALSE
SQL%FOUND TRUE 有结果 成功 成功
SQL%FOUND FALSE 没结果 失败 失败
SQL%NOTFUOND TRUE 没结果 失败 失败
SQL%NOTFOUND FALSE 有结果 成功 失败
SQL%ROWCOUNT 返回行数,只为 1插入的行数 修改的行数 删除的行数
使用案例:
DECLARE
v_rows NUMBER;
BEGIN
--更新数据
UPDATE emp SET sal = 30000
WHERE deptno = 20;
--获取默认游标的属性值
v_rows := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE('更新了'||v_rows||'个雇员的工资');
--回退更新,以便使数据库的数据保持原样
ROLLBACK;
END;
plsql--游标用法的更多相关文章
- Sybase:游标用法以及嵌套用法
Sybase:游标用法以及嵌套用法 游标示例一: --Sybase游标示例一: create PROCEDURE DBA.p_proc_test() ON EXCEPTION RESUME begin ...
- sql的游标用法举例(Cursor)
sql的游标用法举例 ), ) Declare authors_cursor Cursor For Select Name,TrueName From Account Open authors_cur ...
- PLSQL游标使用
游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据.由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标.游标可以看做是指向记录 ...
- oracle游标用法
-- 声明游标:CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...
- PLSQL游标
静态游标:结果集已经确实(静态定义)的游标.分为隐式和显式游标 隐式游标:所有DML语句为隐式游标,通过隐式游标属性可以获取SQL语句信息: 显式游标:用户显式声明的游标,即指定结果集.当查询返回结果 ...
- SQL记录-PLSQL游标
PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...
- Oracle PLSQL游标、游标变量的使用
参考文章:https://www.cnblogs.com/huyong/archive/2011/05/04/2036377.html 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实 ...
- SQL server 游标用法
declare @EmpCode varchar(50), @EmpName varchar(50), @EmpAddress varchar(200);declare curEmployee cur ...
- PLSQL 几种游标的用法
分类: Oracle 1. PL/SQL里的游标可以分为显式和隐式两种,而隐式有分为select into隐式游标和for .. in 隐式游标两种.所以,我们可以认为,有3种游标用法: A. 显式游 ...
- PLSQL开发笔记和小结(转载)
***************************************** PLSQL基本结构 ***************************************** 基本数据 ...
随机推荐
- 【SQL SERVER】DATEDIFF() :两个日期的日期差
定义用法 DATEDIFF() 函数返回两个日期之间的日期差. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 enddate 参数是合法的日期 ...
- Qt构造函数和析构函数报错undefinedreferenceto`vtable for 。。。。'
百度了一堆,说各种的都有,无非就是说什么构造函数没有实现父类的纯虚函数,但是我明明继承并实现了,,,最后发现可能就是单纯的Qtcreater抽风了,一开始在构造里面清理了项目,发现不行. 于是一不做二 ...
- hive知识点总结
hive知识点总结 1.什么是HIVE? 1.hive是hadoop生态圈的一个工具,提供一种结构化查询语言,可以查询HDFS或者其他文件系统上的文件. 2.hive操作: 1.hive一次使用命令: ...
- dcat-admin主题
1.白色主题 admin设置: css /*对于在表单中使用grid列表时点击按钮时没有提示和报错,是因为 显示的html与当前弹框错位了,并隐藏在当前弹框下*/ .popover{ z-index: ...
- flink sql任务出现java.lang.OutOfMemoryError: Metaspace
线上任务一直出现以下错误导致一直重启,然后一直因为这个错误挂掉 org.apache.flink.shaded.guava18.com.google.common.util.concurrent.Ex ...
- Spring @aspect
在 开发过程中,需要对每个 方法 执行时 进行日志 记录, 故而 整理一下, 有关 AOP 的 相关 知识点. 1. 切面类: @Aspect : 定义切面类, 加上 @Aspect,@Compo ...
- [Swift]创建桥接文件,Swift使用MJRefresh刷新插件
刚开始玩Swift,想做个下拉刷新的功能,发现在OC中用得比较多的第三方插件是MJRefresh.查了一下,在Swift中使用OC的插件要通过桥接文件,然后又百度一下怎么创建桥接文件,发现很多都是老司 ...
- NodeJS增删改查的获取方法
get獲取方法 ctx.query post獲取方法 ctx.request.body delete ctx.request.body put ctx.query ctx.request.body
- 使用vue渲染大量数据时应该怎么优化?
Object.freeze 适合一些 big data的业务场景.尤其是做管理后台的时候,经常会有一些超大数据量的 table,或者一个含有 n 多数据的图表,这种数据量很大的东西使用起来最明显的感受 ...
- DP4398 是一个立体声 24 位/192kHz 数模转换芯片-替代CS4398
DP4398 是一个立体声 24 位/192kHz 数模转换芯片.该 D/A 系统包括数字去加重.半分贝步长音量控制.ATAPI 通道混频.可选择的快速和慢速数字插补滤波器和过采样多位增量 Sigma ...