1.流程控制语句
可以控制程序执行的流程。
2.条件控制
IF 语句
IF 语句根据条件执行一系列语句,有三种形式:IF-THEN、IF-THEN-ELSE 和 IF-THEN-ELSIF
1.if语句
语法:
if 条件表达式 then
plsql语句;
end if;
语义:如果条件表达式成立,那么执行then后面的plsql代码,如果条件不成立跳过if语句执行其它语句
如:
declare
--声名一个变量用来存放从键盘输入的值
v_str varchar2(20);
begin
--从键盘输入一个颜色字符串存入变量v_str
v_str:='&请输入一个颜色';
--判断输入的颜色是否为red,如果是red输出它是红色,如果不是输入其它颜色
if v_str='red' then
dbms_output.put_line('它是红色');
end if;
if v_str!='red' then
dbms_output.put_line('其它颜色');
end if;
end;
2.if else 语句
语法:
if 条件表达式 then
plsql语句;
else
plsql语句;
end if;
语义:如果if的条件表达式成立,执行then后面的代码,如果条件不成立执行else后面的代码;
如:
declare
--声名一个变量用来存放从键盘输入的值
v_str varchar2(20);
begin
--从键盘输入一个颜色字符串存入变量v_str
v_str:='&请输入一个颜色';
--判断输入的颜色是否为red,如果是red输出它是红色,如果不是输入其它颜色
if v_str='red' then
dbms_output.put_line('它是红色');
else
dbms_output.put_line('其它颜色');
end if;
end;
(3)elsif语句
语法:
if 条件表达式1 then
plsql语句1;
elsif 条件表达式2 then
plsql语句2;
...
elsif 条件表达式n then
plsql语句n;
else
plsql语句;
end if;
语义:如果条件表达式1成立,执行语句1,如果条件1不成立,判断第二个条件表达式,如果成立执行语句2,不成立判断下一条件,如果所有条件都不成立执行else后面的语句.其中elsif可以有多个,else部分可以省略
如:
--根据输入的字符串判断是什么动物
declare
--声名一个字符串变量保存输入的内容
v_str varchar2(20);
begin
--用变量v_str接收输入的数据
v_str:='&animal';
--如果是dog,输出它是一只狗
if v_str='dog' then
dbms_output.put_line('它是一只狗');
elsif v_str='cat' then
--如果是cat,输出它是一只猫
dbms_output.put_line('它是一只猫');
elsif v_str='pig' then
--如果是pig,输出它是一头猪
dbms_output.put_line('它是一头猪');
else
--输出其它生物
dbms_output.put_line('其它生物');
end if;
end;
CASE 语句
语法1:
case
when 条件表达式1 then
值1;
when 条件表达式2 then
值2;
when 条件表达式3 then
值3;
...
else
默认值;
end case;
语法2:
case 条件表达式
when 值1 then
plsql语句1;
when 值2 then
plsql语句2;
...
when 值n then
plsql语句n;
else
plsql语句;
end case;
语义:如果条件表达式的值,等于某个when后面的值,那么就执行相应then后面的plsql语句,如果表达式的值没在when所列的值中,那么执行else后面的语句,其中else部分可以省略。
如:
--根据输入的字符串判断是什么动物
declare
--声名一个字符串变量保存输入的内容
v_str varchar2(20);
begin
--用变量v_str接收输入的数据
v_str:='&animal';
--如果是dog,输出它是一只狗
case v_str
when 'dog' then
dbms_output.put_line('它是一只狗');
when 'cat' then
--如果是cat,输出它是一只猫
dbms_output.put_line('它是一只猫');
when 'pig' then
--如果是pig,输出它是一头猪
dbms_output.put_line('它是一头猪');
else
--输出其它生物
dbms_output.put_line('其它生物');
end case;
end;
3.循环控制
循环控制用于重复执行一系列语句
循环控制的三种类型:
LOOP - 无条件循环
WHILE - 根据条件循环
FOR - 循环固定的次数
LOOP 循环
语法:
loop
plsql语句;
exit when 退出循环条件;
循环控制语句;
end loop;
如:
--循环打印1到9的9个数字
declare
--声名一个变量,用来存放一个数字,(循环变量)
v_n number(10); --可以在此处赋值
begin
--给循环变量赋值为1
v_n:=1;
--循环语句
loop
--循环体执行的plsql语句
dbms_output.put_line(''||v_n);
--退出循环条件
exit when v_n=9;
--改变循环变量的值,保证循环不会死循环(循环控制语句)
v_n:=v_n+1;
end loop;
dbms_output.put_line('v_n='||v_n);
end;
exit when:退出循环关键字,如果条件成立立即退出循环
continue:退出本次循环,不会结束循环
return:退出程序,结束整个程序
WHILE 循环
语法:
while 循环条件 loop
循环体语句;
循环控制语句;
end loop;
如:
--循环打印1到9
declare
--声名一个变量,来控制循环
v_n number(10);
begin
--给循环变量赋值
v_n:=1;
--while循环语句
while v_n <10 loop
--循环体语句(打印数字)
dbms_output.put_line(''||v_n);
--循环控制语句
v_n:=v_n+1;
end loop;
dbms_output.put_line('v_n='||v_n);
end;
FOR 循环
语法:
for 循环变量 in [reverse] 集合|查询语句|游标变量 loop
循环体语句;
end loop;
循环变量:不需要在declare中声名,变量类型,根据in后面的集合或者查询语句而定,普通数据类型,record类型
reverse:可选参数,表示循环的方向,不加表示从开始到结尾,加上表示从结尾到开头
数字类型集合写法
minValue .. maxValue 例如 1..10
如:
--循环打印1 到9
begin
--for循环语句
for i in 1..9 loop
--循环体语句
dbms_output.put_line(''||i);
end loop;
end;
for循环查询结果集
--循环打印dept表中的部门信息
begin
--for循环语句,循环变量v_dept是一个记录类型,查询语句是*,dept%rowtype
for v_dept in (select * from dept) loop
--循环体语句,打印部门信息
dbms_output.put_line(v_dept.deptno||','||v_dept.dname||','||v_dept.loc);
end loop;
end;
--循环打印dept表中的部门信息
begin
--for循环语句,循环变量v_dept是一个记录类型,查询语句是*,dept%rowtype
for v_dept in (select * from dept where deptno=&deptno) loop
--循环体语句,打印部门信息
dbms_output.put_line(v_dept.deptno||','||v_dept.dname||','||v_dept.loc);
end loop;
end;
select into语句:
语法:select 列名,列名,..,列名 into 变量1,变量2,..,变量n|record变量|rowtype变量 from 表名 where 条件;
注意:select into语句查询出的结果只能是一条数据,超过一条数据会报错;
--输入一个部门编号,打印这个部门的信息
declare
--声名一个变量用来保存输入的部门编号
v_deptno number(10);
--声名一个dept%rowtype类型的变量来保存一条部门信息
v_dept dept%rowtype;
begin
--接收从键盘输入的部门编号
v_deptno:=&deptno;
--根据输入的部门编号查询出部门信息
select * into v_dept from dept where deptno=v_deptno;
--打印部门信息
dbms_output.put_line(v_dept.deptno||','||v_dept.dname||','||v_dept.loc);
end;
--输入一个部门编号,打印这个部门的信息
declare
--声名一个变量用来保存输入的部门编号
v_deptno number(10);
--声名一个变量用来保存部门编号
v_dno dept.deptno%type;
--声名一个变量用来存放部门名称
v_dname dept.dname%type;
--声名一个变量用来存放部门位置
v_loc dept.loc%type;
begin
--接收从键盘输入的部门编号
v_deptno:=&deptno;
--根据输入的部门编号查询出部门信息
select deptno,dname,loc into v_dno,v_dname,v_loc from dept where deptno=v_deptno;
--打印部门信息
dbms_output.put_line(v_dno||','||v_dname||','||v_loc);
end;
4.顺序控制
顺序控制用于按顺序执行语句
顺序控制语句包括:
GOTO 语句 - 无条件地转到标签指定的语句
NULL 语句 - 什么也不做的空语句
GOTO 语句
语法:
<<lable>>
循环执行的plsql语句;
if 条件 then
goto lable;
end if;
<<>>:标签定义符
lable:标签名,符合标识符命名规范
goto语句:程序回到标签处执行
--循环打印1到9
declare
v_n number(10):=1;
begin
<<mylable>>
dbms_output.put_line(''||v_n);
v_n:=v_n+1;
if v_n<10 then
goto mylable;
end if;
end;
NULL 语句
NULL: plsql中的空语句,它什么也不做,就是占位置