oracle游标简介.txt43风帆,不挂在桅杆上,是一块无用的布;桅杆,不挂上风帆,是一根平常的柱;理想,不付诸行动是虚无缥缈的雾;行动,而没有理想,是徒走没有尽头的路。44成功的门往往虚掩着,只要你勇敢去推,它就会豁然洞开。成都朗沃65 Oracle《游标》(2010-04-13 21:42:38)转载标签: 杂谈
1.在块中执行查询能不能直接执行查询,为什么?
不能,因为返回的结果必须要有变量返回;
增删改有结果返回,这个结果保存在sql对象中;
2.游标慨念
pl/sql中执行的结果放在内存中的,内存中的地址就叫游标;
3。什么时候需要用显式游标
在PL/SQL块中需要处理多条数据时
游标分类:
1)for循环:
语法 for 变量名 in (查询)
loop
处理代码
oracle游标的使用列子:
begin
for x in (select * from t_stu)
loop
dbms_output.put_line(x.s_id||','||x.money);
end loop;
end;
要点
·for中的变量名不需要定义
·for中的变量名可以理解为一个“行变量”。在循环中,分别代表查询结果的第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.如何在游标中修改数据
要点
·for update; //锁定查询出来的数据
或者
·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 up
date;
会锁定。因为查询的目的是修改(加锁)。
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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论