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;
时间: 2024-08-08 11:20:48

Oracle存储过程开发学习的相关文章

Oracle存储过程的学习

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param1: If (判断条件) then Select 列名 into 变量2 from 表A where列名=param1: Dbms_output.Put_line('打印信息'); El

Oracle 存储过程学习

Oracle 存储过程学习 目录 Oracle 存储过程 1 Oracle存储过程基础知识 1 Oracle存储过程的基本语法 2 关于Oracle存储过程的若干问题备忘 4 1. 在Oracle中,数据表别名不能加as. 4 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了. 5 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常. 5 4.

Oracle存储过程学习使用

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param1: If (判断条件) then Select 列名 into 变量2 from 表A where列名=param1: Dbms_output.Put_line(‘打印信息’); El

Oracle 存储过程学习笔记

1.存储过程简单实例 CREATE OR REPLACE PROCEDURE 存储过程名称 (参数in,参数out) AS -- 变量声明,每个声明用分号结束.可以在声明的同时初始化 name varchar2(50); age number(8) default 0; --开始逻辑运算 BEGIN --业务逻辑 END 2.游标实现方式. --显式实现方式(可以实现多值) cursor cursorVar is select event_id, isagain, rate from call_

oracle存储过程及Java调用

初次研究出bug的地方非常多,所以注意点非常多,花了我三天时间除尽所有bug,我会把注意点都列出来,可能有落下的地方,还请多指正,相互探讨. 首先上最终测试成功版存储过程代码:(里面代码可能不尽对你都有用,借鉴参考吧,我全贴出来也是为了我以后好查) 说一下jar包用的是ojdbc14.jar,至于什么class12.jar.ojdbc6.jar啊应该都可以,只要一种就可以了. 说说我的需求,以便让大家更顺利的看懂我的代码,我的需求是:存储过程从Java端接收两个参数userid(用户)和topi

springMVC + oracle存储过程 构建高性能灵活易维护的java web架构

MVC让简单的业务也变得复杂 不知道你在使用MVC模式开发项目的时候是否觉得很麻烦,一个简单的增删改查动作却要涉及到多个文件操作. 以一条数据增加为例说明. 假设我们使用hibernate并且dao层是已经封装好的 从图中可以看出如果我们在系统中写一个增加功能需要自己动手写的地方至少是 jsp , action , service,servicesImpl 四层. 如果是复杂的添加操作那么我们很可能还会自己定义dao层的接口和方法,那样就是6层操作了. 如果使用mybatis 至少也是写4层,常

Oracle 存储过程定义和优点及与函数区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可.在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包. 优 点: 1.(预编译)存储过程只在创造

用java调用oracle存储过程总结(转)

//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立连接 Connection conn=null; conn=DriverManager.getConnection(); //3.使用java.sql.*类 CallableStatement cs=conn.prepareCall(str); //4.传入in值 cs.setInt(1,id); cs.se

Oracle存储过程的编写经验与优化措施

1.开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用"databsevv.dbo.table_name",因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验. 2.开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查. 3.高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a) SQL的使用规范: i. 尽量避免大事务操作,慎用ho