--为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 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;