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 ;