标题一:IF…THEN
标题二:IF…THEN…ELSE
标题三:IF…THEN…ELSEIF
标题四:CASE WHEN…THEN…ELSE…END CASE
标题五:CASE…WHEN…THEN…ELSE…END CASE
标题六:LOOP
6.1 loop
loop…end loop
6.2 exit语句必须放在循环内,return语句可以在正常到达程序结尾之前而终止执行
loop
...
if...then
...
exit;
end exit;
end loop;
6.3exit…when
loop
fetch c1 --就是把游标的值取出来,放到指定变量中
into...
exit when c1%notfound;
...
end loop;
close c1;
6.4循环标签 <>
<<name>>
loop
...
end loop name; --这里name可写可不写
使用标签退出循环
<<name>>
loop
...
loop
...
exit name when ... --退出外部循环name,则嵌套的内部循环也退出
end loop;
end loop name;
6.5While…Loop
while boolean --避免死循环
loop
...
end loop;
6.6For…loop
注意: 可以使用(…)两个点号界定范围
注意: 这里 i 就是循环计数器,不能在后面通过 i := 6 方式进行重新赋值
for i in 1..3 loop --i在1,2,3依次循环执行loop语句
...
end loop;
for i in reverse 1..3 loop --i在 3,2,1依次执行loop
...
end loop;
6.6.1循环范围
注意:1.循环范围的边界可以是文字,变量或表达式,但是都必须是数字,否则异常,下界不一定是1,但是循环计数器只能每次+1,
2. 没有step语法指定循环增量,但是可以通过在for循环内部扩大循环计数器的倍数来实现
注意:1.数值溢出,因为 integer类型在 -231~231 , 在plsql内部把边界赋值给一个临时的pls_integer变量,而pls_integer的范围就是-231~231 , 如果使用的循环范围超过则会报错
例如: for i in 1…2**32 loop…就会报错
6.6.2动态范围
循环的上界未知,通过其他方式获取
注意: 如果循环的下界超过上界就会不被执行loop
6.6.3作用域规则
循环计数器只在循环内部定义,不能在循环外部引用,循环退出后,循环计数器就会失效,
注意:
1.循环计数器隐式声明为integer,所以无需显示声明.另外本地声明会覆盖全局声明
2.如果想要引用全局变量,需要使用标签<<名称>>
<<topic>>
declare
i integer
...
begin
...
for i 1..10 loop
...
if topic.i > 10 then --引用全局变量
...
end if;
end loop;
end topic;
6.6.4使用exit语句
<<topic>>
for i 1..10 loop
...
for j 1..5 loop
fetch c into tmp_rec;
exit topic when c%notfound;
...
end loop;
end loop topic;
7.GOTO语句
作用:无条件跳到一个标签处
前提:该标签是全局唯一
begin
...
GOTO topic;
...
<<topic>>
insert into tmp values...
end;
注意:
1.goto不能跳入if语句
2.goto不能else语句
3.goto不能从case 的一个when子句跳入另一个when子句
4.goto不能从封闭的块跳入它的子块
5.goto不能跳出子程序
6.goto不能从异常控制部分跳入当前块
7.但是: goto可以从一个异常控制程序中跳转到一个封闭块
8.NULL语句
null语句本身什么也不做,只是简单的把控制权交给下一个语句而已