您的位置:首页 > 数据库 > Oracle

oracle_循环loop, 游标cursor

2012-09-18 15:38 363 查看
LOOP(循环):
declare
l_i number:=1;  --循环变量.
begin
--循环1到10里面的数据.
for i in reverse 1..10 loop --reverse 可控制倒序循环
dbms_output.put_line(to_char(sysdate,'HH24:mi:ss'));
dbms_output.put_line(i);
end loop;
--循环表里查出来的数据.
for i in(select rownum from user_objects uo where rownum<10) loop
dbms_output.put_line(to_char(sysdate,'HH24:mi:ss'));
dbms_output.put_line(i.rownum);    --此时的i是一个对像.你可以选择对像的属性.
end loop;

--while循环.为false就退出循环.
while l_i!=11 loop
dbms_output.put_line(l_i);
l_i:=l_i+1;
end loop;

--给循环添加退出条件.
l_i:=1;
loop
--eixt; 可以跳出当前循环.
exit when l_i=10;   --循环退出条件.
dbms_output.put_line(l_i);
l_i:=l_i+1;
end loop;
end;


CURSOR(游标):

--游标不能打开多次.
-- %NOTFOUND  执行行没有找到。
-- %FOUND  执行行找到
-- %ROWCOUNT 游标影响行数
-- %ISOPEN  当前游标是否打开

CREATE OR REPLACE PROCEDURE test_cursor(
i_name IN user_data_base.user_data_name%TYPE   --传入名字
) IS
CURSOR v_refcursor IS SELECT t.user_data_id, t.user_data_nick
FROM user_data_base t WHERE t.user_data_name = i_name;  --游标查询语句

v_gid user_data_base.user_data_id%TYPE;
v_nick user_data_base.user_data_nick%TYPE;

BEGIN

IF v_refcursor%ISOPEN THEN      --打开时先验证是否打开过.
CLOSE v_refcursor;
END IF;

OPEN v_refcursor;     --打开游标.打开游标才会执行上面的SELECT语句.

dbms_output.put_line(v_refcursor%ROWCOUNT);

LOOP
FETCH v_refcursor
INTO v_gid, v_nick; --把游标的值写入变量.

EXIT WHEN v_refcursor%NOTFOUND; --没找到数据.退出条件.

dbms_output.put_line(v_refcursor%ROWCOUNT);    --%ROWCOUNT是当前影响行数. 类似for里的i

dbms_output.put_line('ID:'||v_gid||' NICK:'||v_nick);
END LOOP;
CLOSE v_refcursor;   --关闭游标.

END;


定义和初始化分开:
CREATE OR REPLACE PROCEDURE test_cursor(
i_name IN user_data_base.user_data_name%TYPE   --传入名字
) IS
TYPE t_cursor IS REF CURSOR;   --定义游标类型.
v_cursor t_cursor;         --定放游标

BEGIN

IF NOT v_cursor%ISOPEN THEN
OPEN v_cursor FOR SELECT t.user_data_id, t.user_data_nick
FROM user_data_base t WHERE t.user_data_name = i_name;
END IF;

END;


返回系统游标:
CREATE OR REPLACE PROCEDURE test_cursor(
v_cursor OUT SYS_REFCURSOR          --返回系统游标
) IS
BEGIN

OPEN v_cursor FOR
SELECT t.gid
FROM TEST_TBL t WHERE t.name = 'AAA';

END;


一,continue

在oracle11g以前无法使用continue实现退出当前循环(11g中据说实现了),但是可以用以下方法模拟实现:

declare

--定义变量

begin

for i in 1..10 loop --真正的循环

for j in 1..1 loop --假循环,目的是模拟出continue效果

if i = 6 then

exit;--这个exit相当于continue

end if ;

dbms_output.put_line(i);

end loop ;

end loop;

dbms_output.put_line('over');

end ;

在oracle11g中可以用以下方式实现:

declare

--定义变量

begin

for i in 1..10 loop --真正的循环

if i = 6 then

continue;--用if语句和continue实现

end if ;

dbms_output.put_line(i);

end loop;

dbms_output.put_line('over');

end ;

declare

--定义变量

begin

for i in 1..10 loop --真正的循环

continue when i = 6;--用continue when实现

dbms_output.put_line(i);

end loop;

dbms_output.put_line('over');

end ;

二,break

oracle中并没有break关键字,但是可以用exit关键字来代替break实现退出循环

declare

--定义变量

begin

for i in 1..10 loop

if i > 6 then

exit ;--退出循环,相当于break

end if ;

dbms_output.put_line(i);

end loop ;

dbms_output.put_line('over');

end ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: