• 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;
    
  • 相关阅读:
    Node.js:events事件模块
    Node.js:console模块
    Node.js:DNS模块的使用
    CSS3 Notes: -webkit-box-reflect实现倒影
    H5 Notes:PostMessage Cross-Origin Communication
    H5 Notes:Navigator Geolocation
    Notes:SVG(4)基于stroke-dasharray和stroke-dashoffset圆形进度条
    Notes:SVG(3)---滤镜和渐变
    如何写出优美的 C 代码 面向对象的 C
    Source Insight快捷键
  • 原文地址:https://www.cnblogs.com/super-admin/p/6929587.html
Copyright © 2020-2023  润新知