一、基本程序块
1.条件控制-if
-- 条件控制
if 条件表达式 then
语句块
end if;
if 条件表达式 then
语句块1
else
语句块2
end if;
示例
-- 判断员工是否有奖金,升薪政策
declare
t_empno emp.empno%type;
t_comm emp.comm%type;
begin
t_empno := &eno;
select comm into t_comm from emp where empno=t_empno;
dbms_output.put_line('原来的奖金'||t_comm);
if t_comm = '' or t_comm is null then
update emp set comm = sal * 0.2 where empno=t_empno;
elsif t_comm < 1000 then
update emp set comm = 1000 where empno=t_empno;
else
update emp set comm = comm * 1.1 where empno=t_empno;
end if;
exception
when no_data_found then
dbms_output.put_line('员工编号为'||t_empno||'的员工不存在');
end;
2.条件控制-case
case 表达式
when 条件表达式的结果 then
待执行的语句块
when 条件表达式的结果 then
待执行的语句块
end case;
示例:
-- 输出员工的工资等级(1000以下为C,1000-2000为B,2000以上为A)
declare
t_sal emp.sal%type;
begin
select sal into t_sal from emp where empno=&emp;
case when t_sal<1000 then
dbms_output.put_line('C级');
when t_sal<2000 and t_sal>=1000 then
dbms_output.put_line('B级');
when t_sal>=2000 then
dbms_output.put_line('A级');
end case;
end;
3. while循环
while 条件表达式 loop 语句段;
exit when 条件表达式
end loop;
示例:
-- 打印出从deptno从1到3的部门名称
declare
v_dname varchar2(10);
v_i number(2):=1;
begin
while v_i <=3 loop
select dname into v_dname from (select dname from dept where deptno=v_i);
dbms_output.put_line(v_dname);
v_i := v_i + 1;
end loop;
end;
4.for循环
for 循环变量 in [reverse] 初始值表达式..终止值表达式 loop
语句段;
end loop;
示例:
-- 打印出从deptno从1到3的部门名称
declare
v_dname dept.dname%type;
begin
for v_i in 1..3 loop
select dname into v_dname from (select dname from dept where deptno=v_i);
dbms_output.put_line(v_dname);
end loop;
end;
5.异常处理-exception
-- 自定义异常
declare
no_updata exception;
begin
delete from dept where deptno=11;
if sql%notfound then
raise no_updata;
end if;
exception
when no_updata then
dbms_output.put_line('未找到待删除的数据');
end;
二、代码练习
包含以上所有流程,部分进行调整,可直接复制粘贴,亲测可用
declare
t_empno emp.empno%type;
t_ename emp.ename%type;
t_comm emp.comm%type;
t_sal emp.sal%type;
t_emp emp%rowtype;
v_i number(10):=7500;
no_updata exception;
begin
-- while
while v_i<8000 loop
begin
select ename,comm,sal into t_ename,t_comm,t_sal from (select ename,comm,sal from emp where empno=v_i);
dbms_output.put_line(t_ename);
exception
when others then
dbms_output.put_line('无数据');
end;
v_i:=v_i + 1;
end loop;
-- for
for t_emp in (select * from emp) loop
select ename,comm,sal into t_ename,t_comm,t_sal from (select ename,comm,sal from emp where empno=t_emp.empno);
dbms_output.put(t_ename||'工资为:'||t_sal||' ');
-- if else
if t_comm = '' or t_comm is null then
dbms_output.put(t_ename||'无奖金 ');
else
dbms_output.put(t_ename||'奖金为:'||t_comm||' ');
end if;
-- case
case when t_sal<1000 then
dbms_output.put(t_ename||'的工资等级为C级 ');
when t_sal<2000 and t_sal > 1000 then
dbms_output.put(t_ename||'的工资等级为B级 ');
when t_sal>=2000 then
dbms_output.put(t_ename||'的工资等级为A级 ');
end case;
dbms_output.put_line('');
end loop;
-- exception
delete from emp where empno=1;
if sql%notfound then
raise no_updata;
end if;
exception
when no_updata then
dbms_output.put_line('未找到待删除的数据');
end;