### 1. 游标的概述 ###
1. 隐式游标
Oracle在执行时会自动为我们处理很多和游标相关的操作(声明游标、打开游标、提取记录关闭游标)。隐式游标是最简单最有效的获取数据的方式。
缺点:代码中存在大量相同或相似的select语句,不利于代码的重用。
2. 显式游标
显式游标用在需要获取多行记录的情况下
必须在手动的在PL/SQL块的声明部分定义
手动执行每个操作(打开、提取、数据、关闭)
3. 典型的查询操作
a、 解析 (处理SQL语句的一个步骤是解析,确保SQL语句是有效的)
b、 绑定(将PL/SQL程序中的变量与绑定变量关联)
c、打开(打开游标)
d、 执行(从SQL引擎中运行SQL语句)
e、 提取(在游标的结果集中获取下一行)
f、 关闭(关闭 游标)
游标获取数据库中的数据集合,然后打开提取每次提取后都会定位到下一行,然后从SGA中将数据拿到程序变量中,在此过程中是由Oracle自动将绑定变量与程序变量相关联。
4. 游标属性
a、%found 如果记录成功获取,返回true,否则返回false
b、%notfound 如果记录获取失败,返回true,否则返回false
c、%rowcount 返回从游标中获取的记数
d、%isopen 如果游标是打开的,返回true,否则返回false
e、bulk_rowcount 返回forall语句更改的每个集合元素的记录数
f、bulk_exception 返回forall语句更改的每个集合元素的记录的异常信息
注意:可以在PL/SQL代码中引用游标属性,不能在SQL语句中使用这些属性。
2. 使用显式游标
1. 声明显示游标
cursor 游标名 is select 语句 for update;
游标名 指向的影响这一行类型%rowtype或type类型
2. 打开显式游标
open 显式游标名;
3. 从显式游标中提取记录
fetch 游标名 into 记录或变量列表;
4. 关闭显式游标
close 游标名
- 游标for循环
for 记录 in 游标名 loop 执行语句 end loop;
使用引用游标:
create or replace procedure proc_info(id in int) is
type cur_info is ref cursor; –类型type 游标名 IS ref cursor引用游标
cur_emp cur_info; –游标标量
cur_emp_info emp%rowtype; –影响的整列的数据
begin
open cur_emp for – 打开游标
select from emp where empno=id;
loop
fetch cur_emp into cur_emp_info; –从游标中提取数据
exit when cur_emp%notfound; –退出条件没有记录就退出
dbms_output.put_line(‘ID:’||cur_emp_info.empno|| ‘姓名:’||cur_emp_info.ename ||’工资:’||v_vv.sal);
end loop;
close cur_emp; –关闭游标
end;
call v_v(7499);
select from emp;