PL/SQL 游标的使用详解

一:通过游标,PL/SQL 指向语句被分析以后的活动集

二:对于不同的SQL语句,游标的使用情况不同:
1:非查询语句--隐式的
2:结果是单行的查询语句--隐式的或显式的
3:结果是多行的查询语句--显式的

三:游标属性
1:%FOUND
2:%NOTFOUND
3:%ISOPEN
4:%ROWCOUNT

三:显式游标的用法
四个步骤
(1)定义一个游标名,以及与其相对应的SELECT 语句。语法:CURSOR cursor_name IS select_statement
(2)打开游标。语法:OPEN cursor_name
(3)提取游标。语法:FETCH cursor_name INTO {variable_list | record_variable }。
如:FETCH c_cursor INTO v_ename, v_sal
(4)关闭游标。语法:CLOSE cursor_name
例:
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR c_cursor IS SELECT ename, sal FROM emp WHERE rownum<11;--声明的最后部分定义游标
BEGIN
OPEN c_cursor;--执行部分的开始打开游标
FETCH c_cursor INTO v_ename, v_sal;--打开后提取一次游标
WHILE c_cursor %FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_ename||‘---‘||to_char(v_sal) );
FETCH c_cursor INTO v_ename, v_sal;--循环最后提取游标
END LOOP;
CLOSE c_cursor;--游标提取结束后关闭游标
END;

四:参数化游标
定义游标名的后面加(变量名 类型)。变量用来和SQL的条件语句做比较
例:
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
CURSOR c_cursor(P_sal emp.sal%type)
IS SELECT ename, sal FROM emp WHERE sal >= P_sal;
BEGIN
OPEN c_cursor(1000);
FETCH c_cursor INTO v_ename, v_sal;
WHILE c_cursor %FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_ename||’---‘||to_char(v_sal) );
FETCH c_cursor INTO v_ename, v_sal;
END LOOP;
CLOSE c_cursor;
END;

五:隐式游标
显式游标主要是用于对查询语句的处理,尤其是查询结果为多条记录;
而对于非查询语句,则由系统自动设置游标,
称为隐式游标,隐式游标的名字为SQL,是由系统定义的。
对于隐式游标的操作,如定义、打开、取值及关闭操作,都由系统自动完成,无需用户进行处理。
用户只能通过隐式游标的相关属性,来完成相应的操作。
1:隐式游标属性
(1)%FOUND
(2)%NOTFOUND
(3)%ISOPEN
(4)%ROWCOUNT
例:
DECLARE
V_deptno emp.deptno%TYPE :=&p_deptno;
BEGIN
DELETE FROM emp WHERE deptno=v_deptno;
IF SQL%NOTFOUND THEN
DELETE FROM dept WHERE deptno= 20;
END IF;
END;

六:游标检索循环
例:
DECLARE
v_empno emp.empno%TYPE;
v_sal emp.sal%TYPE;
CURSOR c_cursor IS SELECT empno, sal FROM emp;
BEGIN
OPEN c_cursor;
LOOP
FETCH c_cursor INTO v_empno, v_sal;
EXIT WHEN c_cursor %NOTFOUND;
IF v_sal<=1200 THEN
UPDATE emp SET sal=sal+50 WHERE empno=v_empno;
DBMS_OUTPUT.PUT_LINE(‘编码为‘||v_empno||‘工资已更新!‘);
END IF;
DBMS_OUTPUT.PUT_LINE(‘记录数:‘|| c_cursor %ROWCOUNT);
END LOOP;
CLOSE c_cursor;
END;

七:游标的FOR循环
游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能;
当进入循环,自动打开游标,并提取第一行游标数据。
当处理完当前所提取的数据而进入下一次循环时,自动提取下一行数据。
当提取完结果集中的所有数据后结束循环,并自动关闭游标。

1:语法:
FOR 索引变量名 IN 游标名 LOOP
-- 游标数据处理代码
END LOOP;

例:
DECLARE
CURSOR c_sal IS SELECT empno, ename, sal FROM emp ;
BEGIN
--隐含打开游标
FOR v_sal IN c_sal LOOP
--隐含执行一个FETCH语句。 通过索引变量提取游标数据
DBMS_OUTPUT.PUT_LINE( to_char(v_sal.empno)||‘---‘||v_sal.ename||‘---‘||to_char(v_sal.sal)) ;
--隐含监测c_sal%NOTFOUND
END LOOP;
--隐含关闭游标
END;

例:
DECLARE
CURSOR c_cursor(dept_no NUMBER DEFAULT 10) IS --参数化游标
SELECT dname, loc FROM dept WHERE deptno <= dept_no;
BEGIN
DBMS_OUTPUT.PUT_LINE(‘dept_no参数值为30:’);
FOR c1_rec IN c_cursor (30) LOOP--for循环从索引变量到游标活动集
DBMS_OUTPUT.PUT_LINE(c1_rec.dname||‘---‘||c1_rec.loc);--循环体根据索引提取游标数据
END LOOP;
DBMS_OUTPUT.PUT_LINE(CHR(10)||‘使用默认的dept_no参数值10:‘);
FOR c1_rec IN c_cursor LOOP
DBMS_OUTPUT.PUT_LINE(c1_rec.dname||‘---‘||c1_rec.loc);
END LOOP;
END;

八:游标变量

游标变量是动态的,而游标是静态的。游标只能与指定的查询相连,
即固定指向一个查询的内存处理区域,而游标变量可与不同的查询语句相连,
可以指向不同查询语句的内存处理区域,只要这些查询语句的返回类型兼容即可。

时间: 2024-10-25 02:13:02

PL/SQL 游标的使用详解的相关文章

PL/SQL程序设计基础语法详解(一)

一.什么是PL/SQL(Procedure Language/SQL) 概念:PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循环等),使SQL语言具有过程处理能力. PL/SQL的结构: declare 说明部分 (变量说明,光标申明,例外说明 ] begin 语句序列 (DML语句]- exception 例外处理语句 End; 简单的PL/SQL程序 如果是在命令行中需要使用 set serveroutput on先打开显示 declare

SQL Server表分区详解

原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等.但是数据量少的数据就不要凑这个热

JDBC连接SQL Server 2005步骤详解

一.设置SQL Server服务器:    1."开始" → "程序" → "Microsoft SQL Server 2005" → "配置工具" → "SQL Server Configuration Manager"(确认"SQL Server Management Studio"已关闭)    2."SQL Server 2005 服务"中停止服务"

SQL Server with(nolock)详解

原文:SQL Server with(nolock)详解 大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的. 什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如: 1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读. 2:不可重

sql语句联合查询详解

sql语句联合查询详解 2011-03-01 18:58:22|  分类: mysql|举报|字号 订阅 例子: person表和user表没有约束person表: user表: 有以下几种关联 1.UNION 格式:查询语句 UNION [ALL] 查询语句 [UNION [ALL] 查询语句][…n] 说明:ALL选项表示将所有行合并到结果集合中.不指定该项时,被联合查询结果集合中的重复行将只保留一行. 在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序.例

PL/SQL游标

PL/SQL游标:A:分类:1:隐式游标:非用户明确声明而产生的游标. 你根本看不到cursor这个关键字.2:显示游标:用户明确通过cursor关键字来声明的游标. B:什么是隐式游标:1:什么时候产生:会在执行任何合法的SQL语句(DML---INSERT UPDATE DELETE DQL-----SELECT)中产生.他不一定存放数据.也有可能存放记录集所影响的行数.如果执行SELECT语句,这个时候游标会存放数据.如果执行INSERT UPDATE DELETE会存放记录影响的行数.C

SQL Server:触发器详解

SQL Server:触发器详解 1. 概述 2. 触发器的分类 3. Inserted和Deleted表 4. 触发器的执行过程 5. 创建触发器 6. 修改触发器: 7. 删除触发器: 8. 查看数据库中已有触发器: 9. “Instead of”相关示例: 10. “After”触发器 11. 参考资源 1. 概述 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活. 所以触发器可以用来实现对表实施复杂的完整性约束. 2. 触发器的分类

SQL注入攻防入门详解(2)

SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口.这几天把sql注入的相关知识整理了下,希望大家多多提意见. (对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门查看大量前辈们的心得,这方面的资料颇多,将其精简出自己觉得重要的,就成了该文

[转]SQL注入攻防入门详解

原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口.这几天把sql注入的相关知识整理了下,希望大家多多提意见. (对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么