Oracle存储过程开发学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle存储过程开发学习相关的知识,希望对你有一定的参考价值。

1.rowtype的使用

create or replace procedure PD_ROWTYPE is
   v_emp_rec emp%rowtype;
begin
   select * into v_emp_rec from emp where empno=7839;
   dbms_output.put_line(v_emp_rec.ename||的薪水是||v_emp_rec.sal);
end PD_ROWTYPE;

2.判断用户从键盘输入的数字

accept num prompt请输入一个数字;
declare  
  pnum number :=#
begin
  if pnum=0 then dbms_output.put_line(您输入的数字是0);
     elsif pnum=1 then dbms_output.put_line(您输入的数字是1);
     elsif pnum=1 then dbms_output.put_line(您输入的数字是2);
     else dbms_output.put_line(其他数字);
  end if;
end;

3.使用while循环打印数字的1~10

declare
  pnum number:=1;
begin
  while pnum<=10 loop
    dbms_output.put_line(pnum);
    pnum:=pnum+1;
  end loop;
end;

4.使用loop循环打印

declare
 pnum number:=1;
begin
 loop
    exit when pnum>10;
    dbms_output.put_line(pnum);
    pnum:=pnum+1;
 end loop;
end;

5. 使用for循环打印1~10

declare
 pnum number:=1;
begin
 for pnum in 1..10 loop
  dbms_output.put_line(pnum);
 end loop;
end;

6.-查询并打印员工的姓名和薪水

--光标的属性
--%found  %notfound
declare
 cursor cemp is select ename,sal from emp;
--为光标定义对应的变量
 pename emp.ename%type;
 psal   emp.sal%type;
begin
 -- Test statements here
 open cemp;
 loop
   --取一条记录
   fetch cemp into pename,psal;
   --思考:1.循环什么时候退出?2.fetch不一定能取到记录
   exit when cemp%notfound;
   dbms_output.put_line(pename||的薪水是||psal);
   --打印
 end loop;
 close cemp;
end;

7.给员工涨工资,总裁1000,经理800,其他400

declare
 cursor cemp is select empno,job from emp;
 pempno emp.empno%type;
 pjob emp.job%type;
begin
 -- Test statements here
 open cemp;
 loop
   --取出一个员工
   fetch cemp into pempno,pjob;
   exit when cemp%notfound;
   --判断员工的职位
   if pjob=PRESIDENT then update emp set sal=sal+1000 where empno=pempno;
   elsif pjob=MANAGER then update emp set sal=sal+800 where empno=pempno;
   else update emp set sal=sal+500 where empno=pempno;
   end if;  
 end loop;
 close cemp;
 --事物的提交
 commit;
 dbms_output.put_line(涨工资完成);
end;

8.光标
1)光标的属性
 %found  %notfound
 %isopen 判断光标是否打开
 %rowcount 影响的行数,不是总行数,到目前取走的行数
2)光标的限制:默认情况下,oracle数据库只允许在同一个会话中,打开300个光标
修改光标数的限制:
alter system set open_cursor=400 scope=both;

9.统计每年的入职员工数

declare
 cursor cemp is select to_char(hiredate,yyyy) from emp;
 phiredate varchar2(4);
 --每年入职的员工人数
 count80 number:=0;
 count81 number:=0;
 count82 number:=0;
 count87 number:=0;
begin
 open cemp;
 loop
   --取出一个员工的入职年份
   fetch cemp into phiredate;
   exit when cemp%notfound;
   --判断入职年份
   if phiredate = 1980 then count80:=count80+1;
      elsif phiredate = 1981 then count81:=count81+1;
      elsif phiredate = 1982 then count82:=count82+1;
      else count87:=count87+1;
   end if;
 end loop;
 close cemp;
 --输出结构
 dbms_output.put_line(Total:||(count80+count81+count82+count87));
 dbms_output.put_line(1980:||count80);
 dbms_output.put_line(1981:||count81);
 dbms_output.put_line(1982:||count82);
 dbms_output.put_line(1987:||count87);
end;

10、员工涨工资问题(有bug待完善)

declare
  cursor cemp is select empno,sal from emp order by sal;
  pempno emp.empno%type;
  psal   emp.sal%type;
  --涨工资的人数
  countEmp number:=0;
  --涨后的工资总额
  salTotal number;
begin
 --得到工资总额的初始值
 select sum(sal) into salTotal from emp;
 --打开光标
 open cemp;
 loop
   --1工资总额>5w
   exit when salTotal>50000;
   --取一个员工涨工资
   fetch cemp into pempno,psal;
   --2%notfound
   exit when cemp%notfound;
   --涨工资
   update emp set sal*1.1 empno=pempno;
   countEmp:=countEmp+1;
   --涨后的工资总额=涨钱的工资总额+sal*0.1
   salTotal:=salTotal+psal*0.1;
 end loop;
 --关闭光标
 close cemp;
 commit;
 dbms_output.put_line(人数:||countEmp||涨后的工资总额:||salTotal);
end;

11、对比2种存储过程的写法,该存储过程是用来为emp1表中对于不同层次工资进行相应的增长,2中写法都能达到同样的效果。
第一种写法:

declare
 cursor csr_update is select * from emp1;
 empinfo csr_update%rowtype;
 saleinfo emp1.sal%type;
 empnoinfo emp1.empno%type;
begin
  open csr_update;
  loop 
    fetch csr_update into empinfo;
    exit when csr_update%notfound;
      IF empInfo.SAL<1500 THEN
        saleInfo:=empInfo.SAL*1.2;
       elsif empInfo.SAL<2000 THEN
        saleInfo:=empInfo.SAL*1.5;
        elsif empInfo.SAL<3000 THEN
        saleInfo:=empInfo.SAL*2;
        else
          saleInfo:=empInfo.sal;
      END IF;
      empnoinfo:=empInfo.empno;
      update emp1 set sal=saleinfo where empno=empnoinfo;
  end loop;
  close csr_update;
end;

第二种写法:

declare
        cursor
        csr_Update is select * from  emp1 for update OF SAL;
        empInfo csr_Update%rowtype;
        saleInfo  emp1.SAL%TYPE;
begin
    FOR empInfo IN csr_Update LOOP
      IF empInfo.SAL<1500 THEN
        saleInfo:=empInfo.SAL*1.2;
       elsif empInfo.SAL<2000 THEN
        saleInfo:=empInfo.SAL*1.5;
        elsif empInfo.SAL<3000 THEN
        saleInfo:=empInfo.SAL*2;
        else
          saleInfo:=empInfo.sal;
      END IF;
      UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update;
     END LOOP;
END;

12、对每位员工的薪水进行判断,如果该员工薪水高于其所在部门的平均薪水,则将其薪水减50元,输出更新前后的薪水,员工姓名,所在部门编号。

declare
        cursor
        csr_Update is select * from  emp1 for update OF SAL;
        empInfo csr_Update%rowtype;
        saleInfo  emp1.SAL%TYPE;
begin
    FOR empInfo IN csr_Update LOOP
      IF empInfo.SAL<1500 THEN
        saleInfo:=empInfo.SAL*1.2;
       elsif empInfo.SAL<2000 THEN
        saleInfo:=empInfo.SAL*1.5;
        elsif empInfo.SAL<3000 THEN
        saleInfo:=empInfo.SAL*2;
        else
          saleInfo:=empInfo.sal;
      END IF;
      UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update;
     END LOOP;
END;

13.放入存储过程中嵌套

declare
        cursor
        csr_Update is select * from  emp1 for update OF SAL;
        empInfo csr_Update%rowtype;
        saleInfo  emp1.SAL%TYPE;
begin
    FOR empInfo IN csr_Update LOOP
      IF empInfo.SAL<1500 THEN
        saleInfo:=empInfo.SAL*1.2;
       elsif empInfo.SAL<2000 THEN
        saleInfo:=empInfo.SAL*1.5;
        elsif empInfo.SAL<3000 THEN
        saleInfo:=empInfo.SAL*2;
        else
          saleInfo:=empInfo.sal;
      END IF;
      UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update;
     END LOOP;
END;

 

以上是关于Oracle存储过程开发学习的主要内容,如果未能解决你的问题,请参考以下文章

Oracle调用Java类开发的存储过程函数的方法

Oracle系列:(29)存储过程和存储函数

Oracle 存储过程学习

懵懂oracle之存储过程2

为啥 oracle 存储 java 过程中的相同代码可能比普通 java 慢?

学习下oracle的存储过程增删改查操作以及java调用存储过程