游标/游标变量

显式游标

处理显式游标需要四个 PL/SQL步骤:

定义游标:就是定义一个游标名,以及与其相对应的SELECT 语句

CURSOR cursor_name IS  select_statement;

打开游标:OPEN cursor_name

提取游标:就是检索结果集合中的数据行,放入指定的输出变量中

FETCH cursor_name INTO {variable_list | record_variable };

关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,

并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。

关闭后的游标可以使用OPEN 语句重新打开

CLOSE cursor_name;

例:

 1 DECLARE
 2
 3  v_ename  emp.ename%TYPE;
 4
 5    v_sal      emp.sal%TYPE;
 6
 7    CURSOR c_cursor IS SELECT ename, sal FROM emp WHERE rownum<11;
 8
 9 BEGIN
10
11 OPEN c_cursor;
12
13 FETCH c_cursor INTO v_ename, v_sal;
14
15 WHILE c_cursor %FOUND LOOP
16
17    DBMS_OUTPUT.PUT_LINE(v_ename||‘---‘||to_char(v_sal) );
18
19    FETCH c_cursor INTO v_ename, v_sal;
20
21 END LOOP;
22
23 CLOSE c_cursor;
24
25 END; 

参数化游标

例:

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; 

游标属性

%FOUND :布尔型属性,当最近一次读记录时成功返回,则值为TRUE;

%NOTFOUND :布尔型属性,与%FOUND相反

%ISOPEN: 布尔型属性,当游标已打开时返回 TRUE;

%ROWCOUNT:数字型属性,返回已从游标中读取的记录数。

处理隐式游标

例:

 1 DECLARE
 2
 3 V_deptno emp.deptno%TYPE :=&p_deptno;
 4
 5 BEGIN
 6
 7 DELETE FROM emp WHERE deptno=v_deptno;
 8
 9 IF SQL%NOTFOUND THEN
10
11 DELETE FROM dept WHERE deptno= 20;
12
13 END IF;
14
15 END; 

游标检索循环

例:

 1 DECLARE
 2
 3    v_empno  emp.empno%TYPE;
 4
 5    v_sal      emp.sal%TYPE;
 6
 7    CURSOR c_cursor IS SELECT empno, sal FROM emp;
 8
 9     BEGIN
10
11    OPEN c_cursor;
12
13    LOOP
14
15       FETCH c_cursor INTO v_empno, v_sal;
16
17       EXIT WHEN c_cursor %NOTFOUND;
18
19       IF v_sal<=1200 THEN
20
21             UPDATE emp SET sal=sal+50 WHERE empno=v_empno;
22
23             DBMS_OUTPUT.PUT_LINE(‘编码为‘||v_empno||‘工资已更新!‘);
24
25 END IF;
26
27 DBMS_OUTPUT.PUT_LINE(‘记录数:‘|| c_cursor %ROWCOUNT);
28
29    END LOOP;
30
31    CLOSE c_cursor;
32
33 END; 

游标的FOR循环

FOR index_variable IN cursor_name[value[, value]…] LOOP

-- 游标数据处理代码

END LOOP;

例:

 1 DECLARE
 2
 3    CURSOR c_sal IS SELECT empno, ename, sal FROM emp ;
 4
 5 BEGIN
 6
 7 --隐含打开游标
 8
 9    FOR v_sal IN c_sal LOOP
10
11    --隐含执行一个FETCH语句
12
13    DBMS_OUTPUT.PUT_LINE( to_char(v_sal.empno)||’---‘||v_sal.ename||’---‘||to_char(v_sal.sal)) ;
14
15    --隐含监测c_sal%NOTFOUND
16
17    END LOOP;
18
19 --隐含关闭游标
20
21 END; 

SELECT FOR UPDATE 游标

游标修改和删除操作是指在游标定位下,修改或删除表中指定的数据行。这时,要求游标查询语句中必须使用FOR UPDATE选项

SELECT . . . FROM … FOR UPDATE [OF column[, column]…] [NOWAIT]

例:DECLARE

V_deptno emp.deptno%TYPE :=&p_deptno;

CURSOR emp_cursor IS SELECT empno, sal

FROM emp WHERE deptno=v_deptno FOR UPDATE NOWAIT;

BEGIN

FOR emp_record IN emp_cursor LOOP

IF emp_record.sal < 1500 THEN

UPDATE emp SET sal=1500 WHERE CURRENT OF emp_cursor;

END IF;

END LOOP;

--COMMIT;

END;

游标变量

与游标一样,游标变量也是一个指向多行查询结果集合中当前数据行的指针。但与游标不同的是,游标变量是动态的,而游标是静态的。游标只能与指定的查询相连,即固定指向一个查询的内存处理区域,而游标变量则可与不同的查询语句相连,它可以指向不同查询语句的内存处理区域(但不能同时指向多个内存处理区域,在某一时刻只能与一个查询语句相连),只要这些查询语句的返回类型兼容即可。

游标变量为一个指针,它属于参照类型,所以在声明游标变量类型之前必须先定义游标变量类型。

TYPE ref_type_name IS REF CURSOR [ RETURN return_type] (强[弱]游标变量)

例:声明两个强类型定义游标变量和一个弱类型游标变量

 1 DECLARE
 2
 3 TYPE deptrecord IS RECORD(
 4
 5 Deptno dept.deptno%TYPE,
 6
 7 Dname dept.deptno%TYPE,
 8
 9 Loc dept.loc%TYPE );
10
11 TYPE deptcurtype IS REF CURSOR RETURN dept%ROWTYPE;
12
13 TYPE deptcurtyp1 IS REF CURSOR RETURN deptrecord;
14
15 TYPE curtype IS REF CURSOR;
16
17 Dept_c1 deptcurtype;
18
19 Dept_c2 deptcurtyp1;
20
21 Cv curtype;

打开游标变量 :打开游标变量时使用的是OPEN…FOR 语句

提取游标变量数据 :

关闭游标变量 :

例:强类型参照游标变量类型

 1   DECLARE
 2
 3 TYPE emp_job_rec IS RECORD(
 4
 5 Employee_id emp.empno%TYPE,
 6
 7 Employee_name emp.ename%TYPE,
 8
 9 Job_title emp.job%TYPE);
10
11 TYPE emp_job_refcur_type IS REF CURSOR RETURN emp_job_rec;
12
13 Emp_refcur emp_job_refcur_type ;
14
15 Emp_job emp_job_rec;
16
17 BEGIN
18
19 OPEN emp_refcur FOR
20
21 SELECT empno, ename, job FROM emp ORDER BY deptno;
22
23 FETCH emp_refcur INTO emp_job;
24
25 WHILE emp_refcur%FOUND LOOP
26
27 DBMS_OUTPUT.PUT_LINE(emp_job.employee_id||’: ‘||emp_job.employee_name||‘ is a ’||emp_job.job_title);
28
29 FETCH emp_refcur INTO emp_job;
30
31 END LOOP;
32
33 END; 

例:弱类型参照游标变量类型

 1 DECLARE
 2
 3 Type refcur_t IS REF CURSOR;
 4
 5 Refcur refcur_t;
 6
 7 TYPE sample_rec_type IS RECORD (
 8
 9 Id number,
10
11 Description VARCHAR2 (30) );
12
13 sample sample_rec_type;
14
15 selection varchar2(1) := UPPER (SUBSTR (‘&tab’, 1, 1));
16
17 BEGIN
18
19 IF selection=’D’ THEN
20
21    OPEN refcur FOR SELECT deptno, dname FROM dept;
22
23    DBMS_OUTPUT.PUT_LINE(‘Department data’);
24
25 ELSIF selection=’E’ THEN
26
27    OPEN refcur FOR SELECT empno, ename||’ is a ‘||job FROM emp;
28
29    DBMS_OUTPUT.PUT_LINE(‘Employee data’);
30
31 ELSE
32
33    DBMS_OUTPUT.PUT_LINE(‘Please enter ‘‘D’’ or ‘‘E’’ ’);
34
35    RETURN;
36
37 END IF;
38
39 DBMS_OUTPUT.PUT_LINE(‘----------------------‘);
40
41 FETCH refcur INTO sample;
42
43 WHILE refcur%FOUND LOOP
44
45    DBMS_OUTPUT.PUT_LINE(sample.id||’: ‘||sample.description);
46
47    FETCH refcur INTO sample;
48
49 END LOOP;
50
51 CLOSE refcur;
52
53     END; 
时间: 2024-10-13 16:11:19

游标/游标变量的相关文章

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

sqlserver 表循环-游标、表变量、临时表

SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低.当然,从面向集合操作的角度出发,也有两种方法可以进行遍历表的操作,总结起来,遍历表有下面几种方法. 使用游标 使用表变量 使用临时表 我的需求是:针对HR.Employees表,新增一列fullname,并取值firstname+lastn

【MySQL】存储过程、游标、循环简单实例

有时候仅凭 sql 语句可能达不到想要的数据操作目的,有可能需要写一些方法体,通过循环判断等操作最终达到目的.那么在数据库里实现这种方法体就需要存储过程了,个人觉得一个带注释的简单实例可以简单粗暴地解决大部分问题,当然要深入学习了解的话还是要看教程文档了,话不多说,上码: [sql] view plain copy create procedure my_procedure() -- 创建存储过程 begin -- 开始存储过程 declare my_id varchar(32); -- 自定义

游标的使用

-- 方法1:游标 -- 声明变量 DECLARE @address AS NVARCHAR(50), @neirong AS NVARCHAR(50); -- 声明游标 DECLARE C_MemberPhone CURSOR FAST_FORWARD FOR SELECT address,neirong FROM huiyi; --ORDER BY empid; OPEN C_MemberPhone; -- 取第一条记录 FETCH NEXT FROM C_MemberPhone INTO

SQL Server游标的使用【转】

游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: 而对于游标来说: 这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量…… 从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方: 当你从ATM取钱

SQL Server基础之&lt;游标&gt;

查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录.应用程序可以根据需要滚动或浏览其中的数据.本篇介绍游标的概念.分类.以及基本操作等内容. 一:认识游标   游标是SQL Server的一种数据访问机制,它允许用户访问单独的数据行.用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立即执行或输出. 1.游标的概念  游标是一种处理数据的方法,主要用于存储过程,触发器和 T_SQL脚本中,它们使结果集的内容

oracle中的游标的原理和使用详解

游标 游标的简介: 逐行处理查询结果,以编程的方式访问数据 游标的类型: 1,隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql. 2,显式游标:显式游标用于处理返回多行的查询. 3,REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询的结果 隐式游标: q在PL/SQL中使用DML语句时自动创建隐式游标 q隐式游标自动声明.打开和关闭,其名为 SQL q通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 q隐式游标的属性有:

SQL Server 游标

什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据. 一般复杂的存储过程,都会有游标的出现,他的用处主要有: 定位到结果集中的某一行. 对当前位置的数据进行读写. 可以对结果集中的数据单独操作,而不是整行执行相同的操作. 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁. 游标的分类 根据游标检测结果集变化的能力和消耗资源的情况不同,SQL

Oracle 游标简介

游标 游标的简介:  逐行处理查询结果,以编程的方式访问数据 游标的类型: 1,隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql. 2,显式游标:显式游标用于处理返回多行的查询. 3,REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询的结果 隐式游标: q在PL/SQL中使用DML语句时自动创建隐式游标 q隐式游标自动声明.打开和关闭,其名为 SQL q通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 q隐式游标的属性有: