oracle游标简介
成都朗沃65 Oracle《游标》(2010-04-13 21:42:38)转载标签: 杂谈 1.在块中执行查询能不能直接执行查询,为什么,
不能,因为返回的结果必须要有变量返回;
增删改有结果返回,这个结果保存在sql对象中;
2.游标慨念
pl/sql中执行的结果放在内存中的,内存中的地址就叫游标;
3。什么时候需要用显式游标
在PL/SQL块中需要处理多条数据时
游标分类:
1)for循环:
语法 for 变量名 in (查询)
loop
处理代码
列子:
begin
for x in (select * from t_stu)
loop
dbms_output.put_line(x.s_id||','||x.money);
end loop;
end;
要点
?for中的变量名不需要定义
?for中的变量名可以理解为一个“行变量”。在循环中,分别代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
查询结果的第1行,第2行„„最后一行。
?for循环中的游标(变量名)不需要打开和关闭,所以会被认为是“隐式游标” ?在面试时,如果问“你会不会隐式游标”,不是指SQL对象,而是指游标FOR循环。 end loop;
2)显示游标
简化语法:cofwc
例子:
declare
cursor my_cur is select * from t_stu; --c
stu_row my_cur%rowtype;
begin
open my_cur; --o
fetch my_cur into stu_row;--f
while(my_cur%found) --w
loop
dbms_output.put_line(stu_row.s_name);
fetch my_cur into stu_row; --继续
end loop;
close my_cur; --c
end;
要点:
?定义游标,并指明select语句
?游标会返回结果集,所以必须要定义行变量来接收每一行的值
?说明
如果定义游标用 select * from t_stu
则可以 stu_row my_cur%rowtype;
或者 stu_row t_stu%rowtype; ?fetch my_cur into stu_row; (fetch:抓取)
第一次执行时,游标是从第0行移动到第1行,再将第1行的数据放到stu_row中
注意:fetch有两个动作:一是向下移动;二是获取数据
?while(my_cur%found) 如果游标抓取到数据
?fetch my_cur into stu_row; --继续下移和抓取
?为了释放资源,一定要close
4.如何在游标中修改数据
要点
?select...for update; //锁定查询出来的数据
或者
select...for update nowait;//如果已经被别人锁定,则不等待 ?update/delete ..... where current of 游标名;
例子:
select * from t_stu where s_id=125;
能执行,因为Oracle中查询是不会锁定的。
update t_stu set money=100 where s_id=125;
会锁定(卡住了)。因为同一行已经被其它会话修改后没有提交,即锁没有释放。
select * from t_stu where s_id=125 for update;
会锁定。因为查询的目的是修改(加锁)。
select * from t_stu where s_id=125 for update nowait;
不会锁定。但是也获取不到数据,会报异常:
ORA-00054: 资源正忙,
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
指定 NOWAIT
****最好能和JAVA程序联合使用。
5.如何在游标中使用条件(传递参数),
一种:
FORdeclare
v_sex t_stu.s_sex%type;
begin
v_sex:='&性别';
for x in (select * from t_stu where s_sex=v_sex)
loop
dbms_output.put_line(x.s_name);
end loop;
end;
二种:显式游标
declare
cursor my_cur(v_sex t_stu.s_sex%type)
is
select * from t_stu where s_sex=v_sex ; --c
stu_row my_cur%rowtype;
begin
open my_cur('女'); --o
fetch my_cur into stu_row;--f
while(my_cur%found) --w
loop
dbms_output.put_line(stu_row.s_name);
fetch my_cur into stu_row; --继续
end loop;
close my_cur; --c
end;