/************************************************
我与游标
/************************************************
使用显式游标
定义游标DECLARE
CURSOR cursor_name IS select_statement;
打开游标OPEN
OPEN cursor_name
提取游标FETCH
FETCH cursor_name INTO variable1,variable2,...;
关闭游标CLOSE
CLOSE cursor_name;
显式游标属性
%ISOPEN判断是否已经打开 打开TRUE
%FOUND是否从结果集中提取到了数据 提取到TRUE
%NOTFOUND是否从结果集中提取到了数据 没有提取到TRUE
%ROWCOUNT返回到当前行为止已经提取到的实际行数
参数游标
以实现使用不同参数值多次打开游标时,可以生成不同的结果集
CURSOR cursor_name(parameter_name datatype) IS select_statement;
使用游标更新/删除数据
CURSOR cursor_name(parameter_name datatype) IS select_statement FOR UPDATE [OF column_reference] [NOWAIT];
FOR UPDATE用于在结果集数据上加行共享锁,以防止其他用户再次行执行DML操作
OF确定那些表要加锁
NOWAIT指定执行时不等待锁,如果其他会话已经在被作用行上加锁,则当前会话显示错误提示
UPDATE table_name SET column=.. WHERE CURRENT OF cursor_name;
DELETE table_name WHERE CURRENT OF cursor_name;
游标循环
Oracle会隐含地打开游标,提取游标并关闭游标
FOR record_name IN cursor_name LOOP
statement1;
statement2;
...
END LOOP;
如果循环时不需要使用任何游标属性,则可直接使用子查询
FOR record_name IN (select_statement) LOOP
statement1;
statement2;
...
END LOOP;
使用游标变量
定义REF CURSOR类型和游标变量
TYPE ref_type_name IS REF CURSOR [RETURN return_type];
cursor_variable ref_type_name;
打开游标
OPEN cursor_variable FOR select_statement;
提取游标数据
FETCH cursor_variable INTO variable1,variable2,...;
关闭游标CLOSE
CLOSE cursor_variable