游标是从表中提取的数据以临时表的形式存放内存中,游标中有一个数据指针,默认指向的是第一条记录。利用fetch语句移动该指针,从而对游标中的数据进行操作。
语法:
cursor 游标名 is select 语句;
--cursor是定义游标的关键词
--select是建立游标的数据表查询命令.
打开游标:
open 游标名;
打开游标相当于执行了下面两个动作:
a.将符合条件的记录送入内存
b.将指针指向第一条记录
移动指针,将数据提取出来:
fetch 游标名 into 变量名1,变量名2,.......;
fetch 游标名 into 记录型变量名;
关闭游标:
close 游标名;
游标的属性:
--使用方法:游标名%属性
cursor%isopen
--测试游标是否打开,如果没有打开游标就使用fetch语句将提示错误
cursor%found属性
--测试前一个fetch语句是否有数据,有值将返回true,否则为false
cursor%notfound属性
--%found属性的反逻辑,常被用于退出循环,判断游标是否没有数据
cursor%rowcount属性
--用于返回游标的数据行数,若返回值为0,表明游标已经打开,但没有提取出数据.
游标的简单运用:首先建立一个表employee,包含以下字段,往表里插入一些数据;
1.取表里满足条件的第一条记录:
declare
tempsal employee.salary%type;
cursor mycursor is
select * from employee where salary<tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal:=2000;
open mycursor;
fetch mycursor into cursorrecord;
--dbms_output.put_line('test111');
dbms_output.put_line(cursorrecord.empid);
close mycursor;
end;
-----输出结果是:14
2.取满足条件的所有记录需要用到循环,让游标往下移动取值:
declare
tempsal employee.salary%type;
cursor mycursor is
select * from employee where salary<tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal:=2000; --取工资小于2000的放在放在内存中
open mycursor;
--fetch mycursor into cursorrecord; ---注意这里没有fetch(若放在这结果没有首记录)
loop ---循环
fetch mycursor into cursorrecord;
---dbms_output.put_line('test111');
exit when mycursor%notfound; ---没有取到数据了才退出来
---dbms_output.put_line('test222');
dbms_output.put_line(cursorrecord.empid);
end loop;
close mycursor;
end;
-----执行上面结果输出是:14 15 16 17 18
-----若也加上第一个fetch,输出结果为:15 16 17 18。自己可以看程序运行轨迹。
3.取满足条件的前面几条记录,循环时用到for i in 1..n loop(n自己确定):
declare
tempsal employee.salary%type;
cursor mycursor is
select * from employee where salary<tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal:=2000;
open mycursor;
for i in 1..3 loop --游标指针指向对应的数据3次(第一次是首记录)
fetch mycursor into cursorrecord;
--dbms_output.put_line('test222222222222');
exit when mycursor%notfound;
--dbms_output.put_line('test333333333333333');
dbms_output.put_line(cursorrecord.empid);
end loop;
close mycursor;
end;
-----输出的结果是:14 15 16
4.利用mycursor%rowcount确定跳出循环的时间,%rowcount的值要<=满足要求的总记录数
declare
tempsal employee.salary%type;
cursor mycursor is
select * from employee where salary<tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal:=2000;
open mycursor;
loop
fetch mycursor into cursorrecord;
dbms_output.put_line('test111');
-----exit when mycursor%rowcount=4;
dbms_output.put_line(cursorrecord.empid);
dbms_output.put_line(mycursor%rowcount);
exit when mycursor%rowcount=4; --注意这里%rowcount的取值要小于等于总记录数
end loop;
close mycursor;
end;
注意exit when mycursor%rowcount=4的位置:
如果在上面,结果只显示%rowcount-1条记录,原因是只要%rowcount=?后,循环就提前跳出了,没有执行下面的输出语句。
如果在下面,先执行输出语句再判断,判断为false就跳出循环了,输出的结果数位%rowcount个。
5.带参数的游标
declare
cursor mycur(vartype number) is select * from employee where employee.salary=vartype;
begin
for emp in mycur(2000) loop
dbms_output.put_line(emp.empid||','||emp.salary);
end loop;
end;
mycur(2000)是将工资为2000的所有记录放在临时表中,emp为变量名,for emp in mycur(2000) loop是循环取临时表里的数据。
6.存储过程中使用游标
create or replace procedure emp_pro_cur
as
cursor cur is select * from employee where employee.empname like 'd%';
begin
for emp in cur loop --这里for循环,不需要使用fetch移动游标指针
dbms_output.put_line(emp.empname);
end loop;
end;
--调用存储过程
call emp_pro_cur();
- 大小: 32.9 KB
分享到:
相关推荐
### 关于游标的说明与使用方法 #### 一、什么是游标?...无论是简单查询还是复杂的数据处理任务,合理使用游标都能够显著提升程序的性能和可维护性。希望本文能够帮助您更好地理解和掌握游标的使用技巧。
以下是一个简单的游标声明和使用的例子: ```sql DECLARE -- 声明变量来存储游标结果 v_emp_id NUMBER; v_emp_name VARCHAR2(50); -- 定义游标 CURSOR emp_cursor IS SELECT employee_id, first_name FROM ...
一、SQL server 游标的简单使用 一个对表进行操作的T-SQL语句通常都可产生或处理一组记录,但是许多应用程序,尤其是T-SQL嵌入的主语言,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要用一种机制来...
根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用...而对于简单的单行数据更新,则可以利用隐式游标来简化代码实现。掌握这两种游标的使用方法,将有助于提高Oracle应用程序的效率和可维护性。
以下是一个简单的示例,演示如何使用游标来删除员工并记录其信息: ```sql CREATE OR REPLACE PROCEDURE fire_employee(p_empno IN NUMBER) AS v_ename EMP.ENAME%TYPE; BEGIN SELECT ename INTO v_ename FROM ...
3. MySQL提供简单的游标支持,但不支持滚动游标,只支持FOR UPDATE的游标,用于在事务中锁定行。 三、游标的应用场景 1. 分步处理:当需要对查询结果进行逐行处理,如批量更新或插入数据时,游标非常实用。 2. ...
2. **隐式游标**:由PL/SQL自动创建和管理的游标,主要用于简单的SELECT语句,当执行SELECT INTO语句时会自动创建隐式游标。 3. **敏感游标**:在游标打开期间,如果基础数据表的数据发生变化,敏感游标会检测到这些...
- 选择合适的游标类型,隐式游标适用于简单操作,显式游标适合复杂情况。 以上只是对Oracle游标使用的一个简要概述,具体到《Oracle 游标使用大全》这份文档,可能会包含更详尽的示例、技巧和案例,帮助开发者更好...
下面是一个简单的游标示例,用于遍历表中的每一行并打印数据: ```sql DECLARE @id INT, @name VARCHAR(50); DECLARE myCursor CURSOR FOR SELECT ID, Name FROM Employees; OPEN myCursor; FETCH NEXT FROM ...
Oracle数据库中的游标是PL/SQL编程中非常重要的一个概念,它们允许程序逐行...无论是简单的DML操作还是复杂的查询处理,游标都是不可或缺的工具。通过熟练掌握游标的使用,可以极大地提升数据库应用的性能和灵活性。
### Oracle游标使用详解 #### 一、游标概述 游标是Oracle数据库中用于处理查询结果集的强大工具,尤其适用于需要逐行处理查询结果的情况。在Oracle中,游标可以分为两类:**显式游标**和**隐式游标**。 1. **隐式...
### 游标最简单教程知识点解析 #### 一、游标基本概念 游标是数据库管理系统中的一个重要概念,主要用于处理查询结果集中的数据记录。它允许用户逐行地读取和处理这些记录,这对于需要对每一行数据进行特定操作的...
总结来说,Oracle游标提供了一种高效、灵活的方式来处理查询结果,无论是一行还是多行数据,无论是简单的读取还是复杂的更新和删除操作。理解和熟练使用游标是Oracle数据库编程中不可或缺的一部分。
使用游标时,通常会结合循环结构一起使用,如`LOOP`或`FOR`循环。示例代码如下: ```sql OPEN prd_um; LOOP FETCH prd_um INTO v_empno, v_umNum; EXIT WHEN prd_um%NOTFOUND; dbms_output.put_line('v_empno=' ...
例如,for循环会自动打开和关闭游标,并且会自动处理数据的获取,是处理游标最简单、高效的方式。但是,显式游标循环处理的代码更容易理解和维护。 使用游标时,还有一些注意事项。首先,游标打开之后,必须执行...
下面通过一个简单的示例来演示如何使用隐式游标属性来判断对雇员工资的更新是否成功。 ```sql SET SERVEROUTPUT ON; BEGIN UPDATE emp SET sal = sal + 100 WHERE empno = 1234; IF SQL%FOUND THEN DBMS_OUTPUT....