oracle存储过程简单例子

一.从emp表找出所有部门最低工资的员工.如果这个部门的最低员工工资大于1000,直接打印输出,否则插入全局临时表emp_tmp.最后还要更新一下临时表emp_tmp的描述字段des为'最低工资'.这样操作的例子意义不大,只是作为学习存储过程的一个例子.


1.源码

create or replace procedure myprocedure as

  tabExt    varchar2(10); --用于判断临时表是否存在的中间变量
  createStr varchar2(500); --用于创建临时表(如果临时表不存在)
  deleteStr varchar2(50); --用于删除临时表记录(如果临时表存在)
  insertStr varchar2(500); --用于向临时表插入数据(如果临时表存在)
  
  --查询所有部门号
  cursor cur_deptno is select deptno from emp group by deptno order by deptno asc;
  vdeptno emp.deptno%type;
  --查询此部门最低工资员工的信息
  cursor cur_emp(vdeptno number) is select * from (select * from emp where deptno=vdeptno order by sal asc) where rownum<2;
  vemp_rd emp%rowtype;


begin
  select count(1) into tabExt from all_tables where table_name = 'EMP_TMP';
  createStr := 'create global temporary table emp_tmp(
  empno number(4),
  ename varchar2(10),
  sal number(7,2),
  deptno number(2),
  des varchar2(32)
  )on commit preserve rows';
  deleteStr := 'delete from emp_tmp';

  if tabExt = 0 then
    execute immediate createStr;
    dbms_output.put_line('临时表创建成功!');
  else
    execute immediate deleteStr;
    dbms_output.put_line('删除记录完成!');
  end if;

  open cur_deptno;
  loop
    fetch cur_deptno into vdeptno;
    exit when cur_deptno%notfound;
    
    open cur_emp(vdeptno);
         fetch cur_emp into vemp_rd;
         if cur_emp%found then
           if vemp_rd.sal>1000 then --部门最低工资高于1000的,直接输出信息
             dbms_output.put_line(vdeptno||'部门的最低工资是'||vemp_rd.ename||'的工资:'||vemp_rd.sal);
           else --部门最低工资小于1000的要插入临时表
             
             insertStr:='insert into emp_tmp(empno,ename,sal,deptno) values('||vemp_rd.empno||','''||vemp_rd.ename||''','||vemp_rd.sal||','||vemp_rd.deptno||')';
             execute immediate insertStr;
             
           end if;
         end if;
    close cur_emp;
  end loop;
  commit;
  close cur_deptno;
  execute immediate 'update emp_tmp set des=''最低工资''';
end;

2.测试

begin
  myprocedure;
end;
执行这个存储过程,查看输出.,最后查看执行完之后的临时表数据.

select * from emp_tmp;

二.找出与入参员工同一个部门的员工信息(带有入参的存储过程).
1.源码

create or replace procedure myprocedure(pEname in varchar2) as
vdeptno emp.deptno%type;
vemp_rd emp%rowtype;
begin
  --找出入参员工的部门号
  select deptno into vdeptno from emp where emp.ename=pEname;
  if SQL%found then
    dbms_output.put_line('和'||pEname||'同部门的员工信息:');
  end if;
  --轮询所有与入参员工同一个部门的员工
  for vemp_rd in (select * from emp where emp.deptno=vdeptno)
  loop
    if vemp_rd.ename!=pEname then
       dbms_output.put_line('员工号:'||vemp_rd.empno||',员工名:'||vemp_rd.ename||',员工工资'||vemp_rd.sal);
    end if;
  end loop;
--处理异常
exception
  when no_data_found then
    dbms_output.put_line(pEname||'员工不存在!');
  when too_many_rows then
    dbms_output.put_line('不止一个员工叫'||pEname||'!');
end;


2.测试,查看输出

begin
  -- Call the procedure
  myprocedure('SMITH');
end;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值