oracle之游标
Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等。
游标是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)由SQL语句返回。行集合光标保持的被称为活动集合。
可以命名一个光标,它可以在程序中获取和处理SQL语句,一次返回的行引用。有两种类型的游标:
隐式游标
显式游标
隐式游标被用于描述执行的SQL命令,PL/SQL中出现的SQL语句,oracle都会自动的为其分配一段私有的内存空间,也就是私有游标区域。
隐式游标:select * into emp from employees where id=200
显式游标由开发人员通过程序显式控制,用于从表中取出多行数据,并将多行数据一行一行单独进行处理。
显示游标的使用:
可以用于暂存查询取出的多行结果
按行处理查询返回的多行结果
在PL/SQL块中通过循环手动控制游标
游标具有属性(下面为属性的作用)
测试SQL 命令的结果
在PL/SQL中类似于使用函数
通过使用游标的属性,获取游标的状态信息:
属性 类型 描述
%ISOPEN Boolean 如果游标打开,则为TRUE
%NOTFOUND Boolean 如果最近的提取没有返回一条记录,则为TRUE
%FOUND Boolean 一直为TRUE ,直到最近提取没有取回行记录
%ROWCOUNT Number 到目前为止,提取的总行数
后面用循环拿到所有数据的时候会用到属性
游标的使用
游标的使用包含几个内容:声明,打开,获取数据,关闭游标4个步骤
声明游标
声明游标定义游标的名称和相关的SELECT语句 在DECLARE下声明。
CURSOR cursor_name IS select_statement;
在游标声明中,不要包含INTO 子句。
案例:
cursor emp_cursor is
select employee_id,first_name
from employees ;
打开游标
打开游标游标分配内存,使得它准备取的SQL语句转换成它返回的行。例如,我们将打开上述定义的游标如下:
打开游标将执行查询和取出结果集
OPEN cursor_name;
不论查询有没有返回记录,都不会引起异常
在一次取操作后,通过使用游标属性进行测试游标状态
OPEN emp_cursor;
获取游标
检索当前记录的值到输出变量中。
FETCH cursor_name INTO variable1, variable2,... ;
变量应该与游标字段个数相同
变量与字段顺序也应该一一对应
测试判断游标是否还包含更多的数据行
例如:
fetch emp_cursor into v_empno,v_ename;
dbms_output.put_line(v_empno||v_ename);
关闭游标
关闭游标来释放分配的内存
CLOSE cursor_name;
如果需要,必须重新打开游标
一旦游标已经关闭,不能再提取数据。
案例1:使用游标拿到一个员工的first_name,salary
--需求:使用游标拿到员工的first_name,salary
declare
firstName employees.first_name%type;
salary employees.salary%type;
-- 定义一个游标 (注意:这里可以拿到多行的结果)
cursor my_cursor isselect first_name,salary from employees;
begin
-- 打开游标
open my_cursor;
-- 获取一个游标中的数据【属于使用移动光标,取值】
fetch my_cursor into firstName,salary;
dbms_output.put_line(firstName||' '||salary);
--关闭游标
close my_cursor;
end;
使用循环拿到游标数据
一:使用简单循环打印所有员工的值
declare
-- 定义emp类型
emp employees%rowtype; //列类型
-- 定义一个游标:拿到所有员工
cursor my_corsor is select * from employees;
begin
-- 打开游标
open my_corsor;
--循环开始打印游标
loop
-- 移动光标并获取相应的数据
fetch my_corsor into emp;
-- 如果没有相应数据则离开
exit when my_corsor%notfound;
-- 没有离开代表有数据,则可以打印展示出来
dbms_output.put_line(emp.first_name||' '|| emp.salary);
end loop;
--关闭游标
close my_corsor;
end;
二:使用for循环打印所有员工的值
PL/SQL语言提供了游标的for循环语句。自动的执行游标的open,fetch和close。当进入循环后,游标for循环语句会自动的打开游标,并提取第一行数据,当程序处理完当前数据后,自动提取下一行数据。当结果集中的内容提取完毕后,自动关闭游标。
格式:
FOR variables IN cursor_name(value,value...) LOOP
--处理语句
END LOOP;
使用:
declare
-- 定义一个游标
cursor cur_emp is select * from emp where department_id=100;
begin
-- 循环这个游标 [自动打开,fetch,关闭]
-- 当我们把这个游标放到这个for循环的时候,它就会自动打开游标
-- for循环每次取值,都会自动 fetch
-- 自己监控当游标的状态为notfound的时候, 就退出循环,关闭游标
for v_emp in cur_emp
loop
dbms_output.put_line(v_emp.first_name ||' '|| v_emp.salary);
end loop;
end;