• Oracle PL/SQL 存储过程、函数、包 的范例


    1,写函数和过程,输入三角形三个表的长度。在控制台打印三角形的面积

    -- 创建包
    create or replace package pac_area is
    
      -- 定义计算三角形面积的过程
      procedure pro_area (v_side_first number,v_side_second number,v_side_third number);
      -- 定义获取三角形面积的函数
      function fun_area return number;
    
    
    end;
    
    -- 创建包体
    create or replace package body pac_area is
    
      -- 把三角形面积定义成包体的成员变量 
      v_area number(10,2);
      -- 调用包中的过程
      procedure pro_area (v_side_first number,v_side_second number,v_side_third number) is
        v_p number(10,2);
      begin
        v_p:=(v_side_first+v_side_second+v_side_third)/2;
        v_area:=sqrt(v_p*(v_p-v_side_first)*(v_p-v_side_second)*(v_p-v_side_third));
        dbms_output.put_line('三角形的面积为:'||v_area);
      end;
      --调用包中的函数
      function fun_area return number is
      begin
        return v_area;
      end;
    
    end;
    
    
    -- 通过匿名块调用包中的过程和函数
    declare
       -- 声明变量  调用函数时使用
       v_area number(10,2);
    begin
      -- 调用包中的过程
      pac_area.pro_area (3,v_side_third=>5,v_side_second=>4);
      -- 调用包中的函数
      v_area:=pac_area.fun_area ();
      dbms_output.put_line('调用函数面积:'||v_area);
      
    end;

    2,写一个过程,输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)

    -- 创建存储过程    输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)
    create or replace procedure pro_dept (v_deptno number,v_dname out varchar2,v_total out number,v_avg out number) is
     
    begin
      select d.dname,count(e.ename),avg(sal+nvl(comm,0)) into v_dname,v_total,v_avg from emp e inner join dept d on e.deptno=d.deptno where e.deptno=v_deptno group by d.dname;
     
    end;
    
    
    -- 通过匿名块调用存储过程
    declare
      -- 声明变量  接收出参
      v_dname dept.dname%type;
      v_total number(30);
      v_avg number(30,2);
    begin
      --调用过程
      pro_dept (10,v_dname,v_total,v_avg);
       dbms_output.put_line('部门名称:'||v_dname||',总人数:'||v_total||',平均工资:'||v_avg);
    end;

    3,编写一个存储过程,输入一个员工编号,输出该员工的员工编号,员工姓名,部门名称

    -- 创建存储过程
    create or replace procedure pro_emp (v_empno number,v_empno1 out number,v_ename out varchar2,v_dname out varchar2)
    is
    begin
      select e.empno,e.ename,d.dname into v_empno1,v_ename,v_dname from emp e inner join dept d on e.deptno=d.deptno where e.empno=v_empno;
    
    end;
    
    
    -- 通过匿名块调用存储过程
    declare
    
       -- 声明变量,接收出参
       v_empno1 emp.empno%type;
       v_ename emp.ename%type;
       v_dname dept.dname%type;
    
    begin
      -- 调用过程 
      pro_emp (7499,v_empno1,v_ename,v_dname);
      dbms_output.put_line('员工编号:'||v_empno1||',员工姓名:'||v_ename||',部门名称:'||v_dname);
       
    end;

    4,编写一个存储过程,输出所有员工及其部门领导的姓名、员工号及部门号

    -- 创建存储过程
    create or replace procedure pro_emp1 
    is
           -- 声明record类型
           type emp_record_type is record(
           -- 声明record类型中的变量
                v_ename emp.ename%type,
                v_mname emp.ename%type,
                v_empno emp.empno%type,
                v_deptno emp.deptno%type
           );
           -- 声明table类型
           type emp_table_type is table of emp_record_type
           -- 指定下标的增长方式为整数   每次增长1
           index by binary_integer;
           -- 声明table类型的变量
           v_emp emp_table_type;
    begin
      -- 查询所有要打印的数据
       select ename,nvl((select e2.ename from emp e2 where e1.mgr=e2.empno),''),empno,deptno bulk collect into v_emp from emp e1; 
       --循环      控制台打印输出结果
       for v_i in 1..v_emp.count
       loop
         dbms_output.put_line('员工姓名:'||v_emp(v_i).v_ename||'领导姓名:'||v_emp(v_i).v_mname||'员工编号:'||v_emp(v_i).v_empno||'部门编号:'||v_emp(v_i).v_deptno);
       end loop; 
    end;
    
    
    -- 通过call调用存储过程
    call pro_emp1();
  • 相关阅读:
    PHP培训教程 PHP里10个鲜为人知但却非常有用的函数
    跟我学Spring Boot(一)创建Spring Boot 项目
    android 4.0 webview 无法播放视频
    vs2008 安装部署 启动项
    android 使用webview 加载网页
    hbase 无法打开60010网页
    oracle 提示没有监听
    hbase 基本命令
    hbase 单机版安装
    win7 64位远程连接oracle11g64位
  • 原文地址:https://www.cnblogs.com/zhangmenghui/p/10841286.html
Copyright © 2020-2023  润新知