• PL/SQL package 另一篇


    包是一组相关过程、函数、变量、常量#SinaEditor_Temp_FontName、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。一个包由两个分开的部分组成:

    (1)包package声明或定义:包定义部分是创建包的规范说明,声明包内数据类型、变量、常量、游标等元素。

    这部分也是为使用者提供了透明的接口。

    (2)包体packpage body:包体是包定义部分的具体实现。

    (3)将有联系的对象打成包,方便使用

    (4)包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_SQL块中应用这些对象.

    定义包头:

    ----------------------------------------------------------------------------------------------

    create or replace package <Package_name> is

      type <TypeName> is <Datatype>;--定义类型

      -- Public constant declarations

      <ConstantName> constant <Datatype> := <Value>;--声明常量

      -- Public variable declarations

      <VariableName> <Datatype>;  --数据类型

      -- Public function and procedure declarations

      function <FunctionName>(<Parameter> <Datatype>) return <Datatype>; --函数

    end <Package_name>;

    定义包体:

    ----------------------------------------------------------------------------------------------

    create or replace package body <Package_name> is

      -- Private type declarations

      type <TypeName> is <Datatype>;

      -- Private constant declarations

      <ConstantName> constant <Datatype> := <Value>

      -- Private variable declarations

      <VariableName> <Datatype>;

      -- Function and procedure implementations

      function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is --函数的具体内容

        <LocalVariable> <Datatype>;

      begin

       <Statement>;

        return(<Result>);

      end;

    begin

      -- Initialization--初始化包体,每次调用时被初始化

      <Statement>;

    end <Package_name>;

    只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.

    1 包说明和包体必须有相同的名字

    2 包的开始没有begin语句,与存储过程和函数不同。

    3 在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。

    4 在包内声明常量、变量、类型定义、异常、及游标时不使用declare。

    5 包内的过程和函数的定义不要create or replace语句。

    6 包声明和包体两者分离。

    包头(Package)与包体(Package body)的应用

    包的作用: 根据出生年月返回年龄function Getage,返回工资function Getsalary

    --创建环境

    Create Table T_PsnSalary  --工资表

    (

    Fpsncode varchar(4) default '',  --个人代码

    Fpsndesc varchar(20) default '',  --描述

    FpsnBirth varchar(20) default '', --生日

    FpsnSalary number(8,2)            --工资

    );

    --添加数据

    Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C001','张三','1986.01.10',1100);

    Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C002','李四','1980.10.10',3000);

    Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C003','王五','1996.12.10',800);

    commit;

    --创建包头

    create or replace package package_demo is

     function Getage(birthst varchar,birthend varchar) return integer;

     function Getsalary(VFpsncode varchar) return number;

    end package_demo;

    --创建包体

    create or replace package body package_demo is

      function Getage(birthst varchar,birthend varchar) return integer --得到年龄函数

      is

         V_birth integer;

         ToDateEnd Date;

         Toyear number(4);

         Tomonth number(4);

         Fromyear number(4);

         Frommonth number(4);

      begin

       if (birthend='') or (birthend is null) then 

        select sysdate into ToDateEnd from dual; --得到系统时间

        end if;

        Toyear := to_number(to_char(ToDateEnd,'YYYY')); --得到最后年月

        Tomonth := to_number(to_char(ToDateEnd,'MM'));

        Fromyear := to_number(substr(birthst,1,4));--计算的年月

        Frommonth := to_number(substr(birthst,6,2));

        if Tomonth-Frommonth>0 then V_birth:=Toyear-fromyear;

        else V_birth:=Toyear-fromyear-1;

        end if;

        return(V_birth);

      end Getage;

      function getSalary(VFpsncode varchar) return number--返回工资情况

      is

        V_psnSalary number(8,2);

      begin

        Select FpsnSalary into V_psnSalary from T_PsnSalary  where Fpsncode=VFpsncode;

        return(V_psnSalary);

      end getSalary;  

    end package_demo;

    select a.*,package_demo.Getage(Fpsnbirth,'')age from T_psnsalary a;  --调用包得到年龄功能

    select package_demo.getsalary('C001') from dual;                     --代码得到工资
  • 相关阅读:
    14.2.2.4 InnoDB Record, Gap, and Next-Key Locks
    Linux_PXE服务器_RHEL7
    Linux_PXE服务器_RHEL7
    Caused by: java.net.SocketException: Connection reset
    mysql read committed
    Linux_OpenSSH远程连接
    Linux_OpenSSH远程连接
    dns nsswitch.conf
    Python基本语法_强制数据类型转换
    Python基本语法_强制数据类型转换
  • 原文地址:https://www.cnblogs.com/JSD1207ZX/p/9386341.html
Copyright © 2020-2023  润新知