循环及退出循环:
--while
--初值
while 条件
loop
循环体;
循环变量的变化;
end loop;
--break
if 条件 then
exit;
end if;
--continue
<<label>>
....
if 条件 then
goto label;
end if;
--例
declare
i integer;
j integer;
begin
j:=1;
<<b>>
while j<=9
loop
i:=1;
<<a>>
while i<=j
loop
if i=3 then
i:=i+1;
j:=j+1;
goto b;
end if;
dbms_output.put(i||'*'||j||'='||i*j||' ');
i:=i+1;
end loop;
dbms_output.put_line('');
j:=j+1;
end loop ;
end;
游标的使用:
--游标
Result rs = stmt.excuteQuery();
while(rs.next())
{
rs.getString(1);
}
select * from emp;
--游标:指向缓冲区数据行的一个指针(句柄)。
--指针就是存放地址的一个变量。
--用法:
1、声明(declare部分):
cursor 游标名 is
select语句块(标明了游标所指向的数据区域);
2、打开(begin end执行体中)
open 游标名;
(只有在打开游标时,select语句才真正执行,
并把首行地址放入游标)
3、提取游标所指向的数据行(循环)
fetch 游标名 into 指定变量(自行处理)
4、关闭游标
close 游标名;
注意:
1、如果想再次使用被关闭的游标,可以重新开发游标。
2、游标是单向的。如果想重新访问开头的数据,只能
关闭后重新打开使用。
3、重要属性: %found %notfound(没有找到数据)
4、fetch同时完成两件事:
1)移向下一行
2)提取数据
--例子
declare
v_emp emp%rowtype;
cursor cur_emps is
select * from emp;
begin
open cur_emps;
loop
fetch cur_emps into v_emp;
exit when cur_emps%notfound;
dbms_output.put(v_emp.empno||' ');
dbms_output.put(v_emp.ename||' ');
dbms_output.put_line(v_emp.deptno);
end loop;
close cur_emps;
end;
--游标类型的变量
declare
cursor cur_emps is
select empno,ename,sal,deptno from emp;
v_emp cur_emps%rowtype;
begin
open cur_emps;
loop
fetch cur_emps into v_emp;
exit when cur_emps%notfound;
dbms_output.put(v_emp.empno||' ');
dbms_output.put(v_emp.ename||' ');
dbms_output.put_line(v_emp.deptno);
end loop;
close cur_emps;
end;
--参数
declare
cursor cur_emps(dept_no integer) is
select empno,ename,sal,deptno from emp
where deptno=dept_no;
v_emp cur_emps%rowtype;
begin
open cur_emps(20);
loop
fetch cur_emps into v_emp;
exit when cur_emps%notfound;
dbms_output.put(v_emp.empno||' ');
dbms_output.put(v_emp.ename||' ');
dbms_output.put_line(v_emp.deptno);
end loop;
close cur_emps;
open cur_emps(30);
loop
fetch cur_emps into v_emp;
exit when cur_emps%notfound;
dbms_output.put(v_emp.empno||' ');
dbms_output.put(v_emp.ename||' ');
dbms_output.put_line(v_emp.deptno);
end loop;
close cur_emps;
end;