12-10
IF-THEN-ELSE 语句
IF语句:包含IF-THEN和IF-THEN-ELSE
ELSIF语句:如果IF不成立 允许怎样
循环1
IF condition
THEN
.....
END IF;
例子
declare
v_countNUMBER(10):=0;
v_empnoNUMBER(4):=7888;
begin
select count(1) into v_count from emp where empno=v_empno;
IF v_empno=0
THEN
insert into emp(empno,ename,job,hiredate,sal,deptno) values(v_empno,'张三','经理',TRUNC(SYSDATE),1000,20);
END IF;
commit;
exception
when others
then
dbms_output.put_line(SQLERRM);
end;
循环2
IF condition
THEN
......
ELSE
......
END IF;
例子
declare
v_count NUMBER(10):=0;
v_empno NUMBER(4):=7888;
begin
select count(1) into v_count from emp where empno = v_empno;
IF v_count=0
THEN
insert into emp (empno,ename,job,hiredate,sal,deptno) values(v_empno,'张三','经理',TRUNC(SYSDATE),1000,20);
ELSE
update emp set ename='张三',job='经理',hiredate=TRUNC(SYSDATE),sal=1000,deptno=20 where empno=v_empno;
END IF;
commit;
exception
when others
then
dbms_output.put_line(SQLERRM);
end;
嵌套IF语句
declare
v_sal NUMBER(7,2);
v_deptnoNUMBER(2);
v_jobvarchar2(9);
begin
select deptno,v_job,sal into v_deptno,v_job,v_sal from emp where empno=&empno;
IF v_deptno=20
THEN
IF v_job='CLERK'
THEN
v_sal := v_sal *(1+0.12);
ELSIF v_job='ANALYST'
THEN
v_sal := v_sal * (1+0.19);
END IF;
ELSE
dbms_output.put_line('仅部门编号为20的员工才能加薪');
END IF;
end;
IF-THEN-ELSIF语句
IF condition-1
THEN
statements-1
ELSIF condition-N
THEN
statements-N
[ELSE
else_statements]
end if;
当开始IF条件为false或者null时 则elsif 就执行另一个条件 包含多个elsif语句时 只有当有是true时 才会被执行 然后忽略掉所有其他的ELSIF 语句 进入end if。如果所有的elsif都失败 则进入else语句
例子 有问题 待解决
declare
v_character char(1);
begin
v_character := '&tmpvar';
IF v_character = 'A'
THEN
dbms_output.put_line('当前输出字符串:'|| v_character);
ELSIF v_character = 'B'
THEN
dbms_output.put_line('当前输出字符串:'|| v_character);
ELSIF v_character = 'C'
THEN
dbms_output.put_line('当前输出字符串:'|| v_character);
else
dbms_output.put_line('不是1-3之间的字符');
END IF;
END;
18 /
输入 tmpvar 的值: A
原值 4: v_character := &tmpvar;
新值 4: v_character := A;
v_character := A;
*
第 4 行出现错误:
ORA-06550: 第 4 行, 第 17 列:
PLS-00201: 必须声明标识符 'A'
ORA-06550: 第 4 行, 第 2 列:
PL/SQL: Statement ignored
declare
v_character char(1);
begin
v_character := &tmpvar;
IF v_character = '1'
THEN
dbms_output.put_line('当前输出字符串:'|| v_character);
ELSIF v_character = '2'
THEN
dbms_output.put_line('当前输出字符串:'|| v_character);
ELSIF v_character = '3'
THEN
dbms_output.put_line('当前输出字符串:'|| v_character);
else
dbms_output.put_line('不是1-3之间的字符');
END IF;
END;
却可以执行
18 /
输入 tmpvar 的值: 1
原值 4: v_character := &tmpvar;
新值 4: v_character := 1;
当前输出字符串:1
PL/SQL 过程已成功完成。
这样就对了
输入 tmpvar 的值: 'A'
原值 4: v_character := &tmpvar;
新值 4: v_character := 'A';
PL/SQL 过程已成功完成。
SQL> declare
2 v_character char(1);
3 begin
4 v_character := '&tmpvar';
5 IF v_character = 'A'
6 THEN
7 dbms_output.put_line('当前输出字符串:'|| v_character);
8 ELSIF v_character = 'B'
9 THEN
10 dbms_output.put_line('当前输出字符串:'|| v_character);
11 ELSIF v_character = 'C'
12 THEN
13 dbms_output.put_line('当前输出字符串:'|| v_character);
14 else
15 dbms_output.put_line('不是1-3之间的字符');
16 END IF;
17 END;
18 /
输入 tmpvar 的值: A
原值 4: v_character := '&tmpvar';
新值 4: v_character := 'A';
PL/SQL 过程已成功完成。
这样也可以
12-11
CASE 语句分为两种类型
简单CASE语句:简单的CASE语句的选择器是一个变量或是一个返回有效数据类型的函数,选择器不可以是布尔类型
搜索CASE语句:搜索CASE语句的选择器是布尔类型的变量或是返回布尔型的函数,默认的选择器为true,当搜索一个true表达式时,可以省略掉选择器的定义
CASE 。。。。
WHEN .......THEN
.........;
WHEN.........THEN
.........;
ELSE
.........;
END CASE;
declare
v_jobvarchar2(30);
v_empnoNUMBER(4):=&empno;
begin
select job into v_job from emp where empno = v_empno;
CASEv_job
WHEN 'CLERK'
THEN
update emp set sal=sal*(1+0.15)
where empno=v_empno;
dbms_output.put_line('为普通职员加薪15%');
WHEN 'MANAGER'
THEN
update emp set sal=sal*(1+0.20)
where empno=v_empno;
dbms_output.put_line('为管理人员加薪20%');
WHEN 'SALESMAN'
THEN
update emp set sal=sal*(1+0.22)
where empno=v_empno;
dbms_output.put_line('为销售人员加薪22%');
else
dbms_output.put_line('员工职级不再加薪的行列');
end case;
end;
搜索CASE语句
CASE [TRUE | FALSE]
WHEN ......THEN
.............;
WHEN.......THEN
.............;
ELSE
.............;
END CASE;
declare
v_salNUMBER(10,2);
v_empnonumber(10):=&empno;
begin
select sal into v_sal from emp where empno = v_empno;
CASE
WHEN v_sal BETWEEN 1000 AND 1500
THEN
dbms_output.put_line('员工级别:初级职员');
WHEN v_sal BETWEEN 1500 AND 3000
THEN
dbms_output.put_line('员工级别:中级管理');
WHEN v_sal BETWEEN 3000 AND 5000
THEN
dbms_output.put_line('员工级别:高级经理');
ELSE
dbms_output.put_line('不在级别范围之内');
END CASE;
END;
循环控制语句
简单的loop循环:loop-end loop
数字式for循环:指定循环要执行的次数
while循环:仅当特定的循环满足时才执行循环,当条件不再满足时循环终止
exit语句
exit语句:直接退出循环
exit when:当when指定的条件满足时退出循环
1.
loop
.........;
end loop;
2.
loop
.....;
.....;
IF ......THEN;
EXIT;
END IF;
END LOOP;
例子
declare
v_count number(2):=0;
begin
loop
v_count:=v_count+1;
dbms_output.put_line('行' || v_count || ': Hello PLSQL');
IF v_count=10
THEN
EXIT;
end if;
end loop;
dbms_output.put_line('循环已经退出了');
end;
loop
..........;
..........;
exit when .......;
end loop;
例子
declare
v_countnumber(2):=0;
begin
loop
v_count:=v_count+1;
dbms_output.put_line('行' || v_count || ': Hello PLSQL');
exit when v_count=10;
end loop;
dbms_output.put_line('循环已经退出');
end;
使用continue 继续执行循环
continue 不会中断当前循环的执行,但是continue不会马上退出循环,而是将循环执行跳转到语句的开头开始下一次循环,continue 允许跳过部分循环执行的代码重新开始另一次循环。
例子 在一个输出累加循环的代码中 如果循环体计数大于3,则执行额外的输出代码,如果小于3,将跳过部分代码的执行。
declare
x number:=0;
begin
loop
dbms_output.put_line('内部循环值:x' || TO_CHAR(x));
x := x+1;
IF x < 3
THEN
continue;
end if;
dbms_output.put_line('continue之后的值: x=' || TO_CHAR(x));
exit when x = 5;
end loop;
dbms_output.put_line('循环体结束后的值: x = ' || TO_CHAR(x));
end;
continue when 例子
declare
x number:=0;
begin
loop
dbms_output.put_line('内部循环值:x' || TO_CHAR(x));
x := x+1;
continue when x < 3;
dbms_output.put_line('continue之后的值: x=' || TO_CHAR(x));
exit when x = 5;
end loop;
dbms_output.put_line('循环体结束后的值: x = ' || TO_CHAR(x));
end;
while-loop 循环
loop-end loop类似的代码总能被执行至少一次 这种类型的循环也称为出口值守循环。
while-loop循环在代码之前先判断一个条件,如果条件一开始就为假,那么一次循环也不执行,这种类型叫做 入口值守循环。
while ........loop
..........;
..........;
end loop;
declare
v_count PLS_INTEGER :=1;
begin
while v_count