Oracle 流程控制 和 循环控制




--_______________________________________流程控制__________________________________________________

--1 IF (表达式) then 执行的语句 end if; (end if :结束IF) -- 判断满足一种情况的 条件

--2 IF (表达式) then 执行的语句 else 执行的语句 end if; --判断满足两种情况的 条件

--3 IF (表达式) then 执行的语句 elseif 执行的语句 elseif 执行的语句 .... end if; --判断满足多种情况的 条件

--示例1
declare
v_emp emp%rowtype; --自定义一个行类型
v_dept_avgsal number(7,2); --定义个平均工资的变量
begin
v_emp.empno:=&empno; --接受用户的输入 保存到v_emp.empno

--为v_emp 赋值
select sal,comm,deptno into v_emp.sal,v_emp.comm,v_emp.deptno from emp where empno=v_emp.empno;
--输出没有更新前的信息
DBMS_output.put_line('雇员编号;'||v_emp.empno);
Dbms_Output.put_line('雇员更新前的奖金:'|| NVL(v_emp.comm,0));

--查询但前员工编号所在部门的平均工资
select avg(sal) into v_dept_avgsal form emp where deptno=v_emp.deptno;
--判断 该雇员的奖金
if v_emp.comm is null then --判断奖金为 null
--更改该雇员的奖金为 所属部门的平均工资的0.1倍
update emp set comm=v_dept_avgsal*0.1 where empno=v_emp.empno;

else --判断奖金不为 null
if v_emp.sal<v_dept_avgsal then --判断员工的工资 < 部门的平均工资
--更改该员工的奖金 += 部门平均工资的0.1倍
update emp set comm=comm+v_dept_avgsal*0.1 where empno=v_emp.empno;
else --员工工资 > 部门的平均工资
--更改员工的奖金 += 该员工工资的0.1倍
update emp set comm=comm+v_emp.sal*0.1 where empno=v_emp.empno;
end if; --结束 内部的IF
end if; --结束 外部的IF
--查询更改后的奖金 值重新赋值给 v_emp
select comm into v_emp.comm from emp whre empno=v_emp.empno;
--输出来
Dbms_Output.put_line('雇员更新后的奖金:'||v_emp.comm);
Exception --异常
when no_data_found then
Dbms_Output.put_line('该雇员不存在!');
END;


--4 Case (表达式) when (条件表达式结果1 )then 执行语句1 when(条件表达式2) then 执行的语句 2 else 执行的语句 n end Caase; (end case 结束 Case)

--示例1
declare
v_deptno number(2):=&deptno;
begin
case v_deptno
when 10 then
update emp set comm= case when comm is null then 100 else comm*1.1 end where deptno=v_deptno;
when 20 then
update emp set comm= case when comm is null then 200 else comm*1.2 end where deptno=v_deptno;
when 30 then
update emp set comm= case when comm is null then 300 else comm*1.3 end where deptno=v_deptno;
else
DBMS_output.put_line('不存在该部门!');
end Case;
End;
--5 Case when (条件表达式1) then 执行语句1 when (条件表达式2) then 执行语句2 else 执行语句n end case;

--示例1
declare
v_empno number(4):=&empno;
v_sal number(7,2);
begin
select sal into v_sal from emp where empno=v_empno;
case
when v_sal<2000 then
DBMS_output.put_line('一级工资');
when v_sal>=2000 and v_sal<3000 then
DBMS_output.put_line('二级工资');
when v_sal>=3000 and v_sal<4000 then
DBMS_output.put_line('三级工资');
when v_sal>=4000 and v_sal<5000 then
DBMS_output.put_line('四级工资');
else
DBMS_output.put_line('五级工资');
END CASE;
Exception
when no_data_found then
DBMS_output.put_line('输入的员工的编号不正确!');
END;





--__________________________________________循环控制_______________________________________________

--1. LOOP 语句段; exit [when 条件表达式] end Loop; ===>至少执行一次 相当于 do{} while(条件表达式);

--示例1
create table rnd_temp_table --创建表
(
id number(4) primary key; -- 定义Id
value varchar2(10) not null
)

declare
type Rnd_varray_type id varray(4) of varchar2(20); --定义一个长度为4的 varrray 的数据类型
-- 生命一个 varray 类型的变量 并使用构造函数赋值
v_rnd_varray Rnd_varray_type:=Rnd_varray_type('dalias','chicago','boston','newyork');

v_loop number(2):=1; --循环控制变量 (还可以是 其他数据类型)
v_index number(1); --随机数的下标
begin
LOOP
if v_loop=6 then --当 满足条件是 退出
exit;
end if;
v_index:=floor(dbms_random.value(1,5)); -- 使用 函数 产生 1<=n<5 (1,2,3,4) 的随机数 对应 v_rnd_varray 中的下标
insert into rnd_temp_table value(v_loop,v_rnd_varray(v_index)); --向表中添加一条数据
v_loop:=v_loop+1; --循环控制变量++;
END loop;
END;


--2. while 条件表达式 LOOP 执行语句 end LOOP ;(只有条件表达式 为 true时候 就 运行)

--示例1
select ID 编号,shopname 商品名称,stock 库存量,day_salse_volulme 日销售量,max_stock 最大库存量,min_stock 最小库存量 from tb_stock; --创建一张tb_stock表用于 while循环掩饰

declare
v_stock tb_stock%rowtype; --定义一个行类型
v_n number(4):=0; --保存所需的天数
begin
v_stock.Id=&Id; --接受用户的输入
select stock,day_salse_colume,min_stock into v_stock.stock,v_stock.day_sales_volume,v_stock.min_stock from tb_stock where id=v_stock.Id;
while v_stock.stock>v_stock.min_stock
Loop
v_stock.stock:=v_stock.stock-v_stock.day_salse_colume;
v_n=v_n+1;
end Loop;
DBMS_output.put_line('商品编号:'||v_stock.ID);
DBMS_outpyt.pyt_line('采购期限:'||v_n);
Exception
when no_data_found then
DBMS_output.put_line('请输入正确的商品编号!');
END;


--for 循环变量 IN [reverse] 初始值表达式 ... 终值表达式 LOOP 执行语句 END LOOP;

-- 示例1
declare
type Dept_table_type is table of dept%rowtype index by binary_integer; --定义一个行类型
v_dept_table Dept_table_type; --定义一个行类型的变量
begin
--赋值
select deptno,dname into v_dept_table(0).deptno, v_dept_table(0).dname from dept where deptno=10;
select deptno,dname into v_dept_tabel(1).deptno, v_dept_table(1).dname from dept where deptno=20;
select deptno,dname into v_dept_table(2).deptno, v_dept_table(2).dname from dept where deptno+30;
--输出
DBMS_output.put_line('部门编号 部门名称');
for i in 0 ...v_dept_table.count-1 --循环遍历 rowType 的变量
loop
DBMS_output.put_line(v_dept_table(i).deptno||' '||v_dept_table(i).dname);
END LOOP; --结束循环
END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值