1. 游标: 容器,存储SQL语句影响行数。
2. 游标类型: 隐式游标,显示游标,REF游标。其中,隐式游标和显示游标属于静态游标(运行前将游标与SQL语句关联),REF游标属于动态游标(运行时将游标与SQL语句关联)。
3. 隐式游标: DML语句对应的游标,由Oracle自动管理,也称SQL游标。(所有的DML操作都被Oracle内部解析为一个cursor名为SQL的隐式游标)
-- 隐式游标的属性有:
-- %FOUND – SQL 语句影响了一行或多行时为 TRUE
-- %NOTFOUND – SQL 语句没有影响任何行时为TRUE
-- %ROWCOUNT – SQL 语句影响的行数
-- %ISOPEN - 游标是否打开,始终为FALSE
declare aid a.name%type:='liaomin'; --a.name即表a的name字段 这样定义可以不需要知道类型
begin
update a set name='liaomin1' where name=aid;
--隐式游标在执行上面语句就已经停止 所有这里是不知道是否打开的
if(SQL%isopen) then
dbms_output.put_line('打开游标');
end if;
--隐士游标的信息都在SQL变量中 如果update的数据有多条记录 SQL就指向最后一条
if(SQL%notfound) then
dbms_output.put_line('没有');
end if;
if(SQL%found) then
dbms_output.put_line('找到');
end if;
end;
显示游标操作:
(1)声明游标(关联SQL语句) cursor+游标名 is/as sql语句
(2)打开游标(执行SQL语句,填充游标) open+游标名
(3)提取游标的行 fetch 游标名 into 行类型变量
(4)关闭游标 close+游标名
例子
declare arow a%rowtype;
cursor csr is select * from a;
begin
open csr;
loop
fetch csr into arow;
exit when csr%notfound;
dbms_output.put_line(arow.name);
end loop;
close csr;
end;
带参数的游标
declare arow a%rowtype;
paramname varchar(20):='liaomin';
cursor csr(param varchar) is select * from a where name=param;
begin
open csr(paramname);
loop
fetch csr into arow;
exit when csr%notfound;
dbms_output.put_line(arow.name);
end loop;
close csr;
end;
使用显示游标更新行
q 允许使用游标删除或更新活动集中的行
q 声明游标时必须使用 SELECT … FOR UPDATE语句
declare arow a%rowtype;
paramname varchar(20):='liaomin';
cursor csr(param varchar) is select * from a where name=param for update of name;
-- 定义的游标会让数据库对涉及的行(对应的列)加锁,别的会话如果要访问该游标中的行便会进入等待状态。
--如果别的会话一直不解锁,那么你的select就会一直等待下去,
--如果你不想等,只需在for update后面加上nowait就可以解决这个问题了,这样你的选择会立即返回。
begin
open csr(paramname);
loop
fetch csr into arow;
exit when csr%notfound;
update a set name='huqun' where current of csr;
end loop;
close csr;
end;
循环游标
q 循环游标用于简化游标处理代码
q 当用户需要从游标中提取所有记录时使用
q 循环游标的语法如下
declare
cursor csr is select * from a;
begin
for csr_obj in csr
loop
dbms_output.put_line(csr_obj.name);
end loop;
end;
.REF游标和游标变量
q REF 游标和游标变量用于处理运行时动态执行的 SQL 查询
q 创建游标变量需要两个步骤:
q 声明 REF 游标类型
q 声明 REF 游标类型的变量
q 用于声明 REF 游标类型的语法为:
TYPE <ref_cursor_name> IS REF CURSOR
[RETURN <return_type>];
q 打开游标变量的语法如下:
OPEN cursor_name FOR select_statement;
声明强类型的REF游标
type emp_cur is ref cursor return emp%rowtype;
empRecord emp_cur;
声明弱类型的REF游标
type emp_cur is ref cursor;
empRecord emp_cur;
declare
type ref_cursor is ref cursor return a%rowtype;
test_cursor ref_cursor;
row_cursor a%rowtype;
begin
open test_cursor for select * from a;
loop
fetch test_cursor into row_cursor;
exit when test_cursor%notfound;
dbms_output.put_line(row_cursor.name);
end loop;
close test_cursor;
end;