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;
      
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值