设为首页 收藏本站
查看: 2074|回复: 0

[经验分享] Oracle 流程控制 和 循环控制

[复制链接]

尚未签到

发表于 2016-8-12 07:14:31 | 显示全部楼层 |阅读模式
--_______________________________________流程控制__________________________________________________
--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;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256662-1-1.html 上篇帖子: Oracle PL/SQL的练习题 下篇帖子: Oracle 顺序控制,异常处理,动态sql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表