zbb20170601 oracle 存储过程 函数 包

-- 过程 函数----------
-- 过程 ----------

create or replace procedure pro_printemp
is
-- 定义部分
   cursor cur_emp is select * from emp;

begin
  -- 执行部分
  for v_row in cur_emp loop
    dbms_output.put_line(v_row.empno||'  '||v_row.ename||'  '||v_row.deptno);
  end loop;
  
  exception when others then
    dbms_output.put_line(sqlerrm);
end pro_printemp;

-- 执行过程
SQL> execute pro_printemp;

SQL> exec pro_printemp;

-- JDBC调用方式
SQL> call pro_printemp();

-- 定义带参的过程
create or replace procedure pro_pebd(dno number) 
as       cursor cur_emp is select * from emp where deptno=dno;
begin
       for v_row in cur_emp loop
         dbms_output.put_line(v_row.empno||'  '||v_row.ename||'  '||v_row.deptno);
       end loop;

  exception when others then
    dbms_output.put_line(sqlerrm);
end pro_pebd;

-- 执行
SQL> exec pro_pebd(10);

-- 参数的分类:
-- 1- 输入类型参数:参数只负责接收值到过程中

-- 2- 输出类型参数:参数只负责将过程中结果带出
-- 根据员工编号得到工资
create or replace procedure pro_getsal(eno number,esal out number)
is

begin
  select sal into esal from emp where empno=eno;
end pro_getsal;

-- 执行带输出类型参数的过程:
SQL> variable e_sal number; -- 定义一个变量,承载输出值
SQL> exec pro_getsal(7788,:e_sal); -- 执行,注意:变量使用时格式: ":变量名"
SQL> print e_sal; -- 打印变量值,注意:打印时不能带符号":";

-- 3- 输入输出类型参数:参数负责将值带入过程执行,并带出结果

create or replace procedure pro_getsal(val in out number)
is

begin
  select sal into val from emp where empno=val;
  
  exception when others then 
    dbms_output.put_line(sqlerrm);
end pro_getsal;

-- 执行带输入、输出类型的参数:
SQL> var val number; -- 定义变量
SQL> exec :val := 7839; -- 给变量赋值
SQL> exec pro_getsal(:val); -- 执行
SQL> print val;-- 打印结果

/**
     参数定义规范:
     尽量只使用输入类型参数,而尽量不要使用输出类型参数和输入输出类型参数。
*/

-- 函数 ----- 有返回值的过程
-- 注意: 形参不能定义精度
create or replace function fun_getsal(eno number)
       return number
   as
       v_sal number;
   begin
     select sal into v_sal from emp where empno=eno;
     return v_sal;
     
     exception when others then
       dbms_output.put_line(sqlerrm);
   
   end fun_getsal;

-- 执行1:使用变量接收函数结果
SQL> var v_sal number; -- 定义变量
SQL> exec :v_sal := fun_getsal(7788); -- 使用变量接收函数执行结果
SQL> print v_sal; -- 打印变量

-- 执行2:直接将函数结果输出
SQL> exec dbms_output.put_line(fun_getsal(7839));

-- 执行3:JDBC执行
 -- 1 定义变量,在JavaSE中定义
 
 -- 2 执行
SQL> call :v_sal := fun_getsal(7788); -- 使用变量接收函数执行结果
-- 3- 获取变量,在JavaSE中

-- 执行4:像系统提供的函数一样,使用在DML、DDL ... 语句中
-- 输出每个部门员工工资占部门总工资百分比

create or replace function fun_get_dept_sal(dno number) return number
is
  sumsal number;
begin
  select sum(sal) into sumsal from emp where deptno=dno;
  return sumsal;
  
  exception when others then
    dbms_output.put_line(sqlerrm);
end fun_get_dept_sal;

select e.*,round(e.sal/fun_get_dept_sal(e.deptno)*100,2)||'%' percent_sal
from emp e

/**
     定义过程和函数的规范:
         如果不需要返回值,则定义为过程:procedure
         如果需要返回值,则定义为函数:function
         尽量不要使用输出类型的参数
*/

-- 调用函数或者过程时,实参填写的分类:
create or replace procedure pro_addemp(
          v_empno number,v_ename varchar2,v_sal number,v_deptno number) is
begin
  insert into emp(empno,ename,sal,deptno) values(v_empno,v_ename,v_sal,v_deptno);
  commit;
  
  exception when others then
    dbms_output.put_line(sqlerrm);
end pro_addemp;

-- 1- 按位置输入
SQL> exec pro_addemp(1000,'aa',2000,10);
-- 2- 按名称输入
SQL> exec pro_addemp(v_ename => 'bb',
                v_deptno => 20,v_sal => 3000,v_empno => 7777);


-- 3- 混合输入
SQL> exec pro_addemp(1001,'cc',v_deptno => 20,v_sal => 2500);

-- 注意:混合输入时:必须先按位置再按名称,一旦使用了按名称后不能再
--       使用按位置赋值。
-- 错误方式:
-- SQL> exec pro_addemp(1001,'cc',v_sal=>2500,20);

/**
   赋予实参的规范:
   只按照位置赋予,不允许按照名称和混合赋予;
*/


------- 包 ---------
-- 整合一组功能的 过程和函数、变量所形成的一个功能体

-- 1- 声明部分
create or replace package pak_scott is

  -- Author  : ADMINISTRATOR
  -- Created : 2014/8/13 10:35:14
  -- Purpose : operation scott

  -- Public variable declarations
  v_sal number;

  -- Public function and procedure declarations
  function get_sal(eno number) return number;
  procedure print_sal(eno number);
  procedure print_sal(v_ename varchar2);

end pak_scott;
-- 2- 实现部分
create or replace package body pak_scott is

  -- Private variable declarations
  v_deptno number;

  -- public Function and procedure implementations
  function get_sal(eno number) return number
    is
    begin
      select sal into v_sal from emp where empno=eno;
      return v_sal;
    end;
    
  procedure print_sal(eno number)
    as
    begin
      dbms_output.put_line(get_sal(eno));
    end;
 -- private function or procedure 
   function get_eno(v_ename varchar2) return number
     is
        v_eno number;
     begin
       select empno into v_eno from emp where ename=v_ename;
       return v_eno;
     end;
     
     
   -- public print_sal   
   procedure print_sal(v_ename varchar2) 
     is 
     begin
       dbms_output.put_line(get_sal(get_eno(v_ename)));
     end;
   
     
end pak_scott;

-- 执行包:
-- 执行过程
SQL> exec pak_scott.print_sal(7788);

SQL> exec pak_scott.print_sal('KING');
-- 执行函数
SQL> exec dbms_output.put_line(pak_scott.get_sal(7788));

-- 执行(使用)变量
SQL> exec pak_scott.v_sal:=10;
SQL> exec dbms_output.put_line(pak_scott.v_sal);

select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;

 

posted @ 2017-06-01 16:38  DaryllD  阅读(194)  评论(0编辑  收藏  举报