一、 什么是PL/SQL包

一、 什么是PL/SQL

包就是一个把各种逻辑相关的类型、常量、变量、异常和子程序组合在一起的模式对象。包通常由两个部分组成:包说明和包体,但有时包体是不需要的。包说明(简写为spec)是应用程序接口;它声明了可用的类型、变量、常量、异常、游标和子程序,包体(Body)部分完全定义游标和子程序,并对说明中的内容加以实现。

如下例所示,我们可以认为说明部分是一个可选接口,而包体是一个"黑盒"。我们可以调试、增强或替换一个包体而不同改变接口(包说明)。

我们可以从SQL*Plus中使用CREATE PACKAGE语句来创建一个包。语法如下:

CREATE [ORREPLACE] PACKAGE package_name

  [AUTHID {CURRENT_USER | DEFINER}]

  {IS | AS}

  [PRAGMASERIALLY_REUSABLE;]

  [collection_type_definition ...]

  [record_type_definition ...]

  [subtype_definition ...]

  [collection_declaration ...]

  [constant_declaration ...]

  [exception_declaration ...]

  [object_declaration ...]

  [record_declaration ...]

  [variable_declaration ...]

  [cursor_spec ...]

  [function_spec ...]

  [procedure_spec ...]

  [call_spec ...]

  [PRAGMARESTRICT_REFERENCES(assertions) ...]

END [package_name];

 

[CREATE [ORREPLACE] PACKAGEBODY package_name {IS | AS}

  [PRAGMASERIALLY_REUSABLE;]

  [collection_type_definition ...]

  [record_type_definition ...]

  [subtype_definition ...]

  [collection_declaration ...]

  [constant_declaration ...]

  [exception_declaration ...]

  [object_declaration ...]

  [record_declaration ...]

  [variable_declaration ...]

  [cursor_body ...]

  [function_spec ...]

  [procedure_spec ...]

  [call_spec ...]

[BEGIN

  sequence_of_statements]

END [package_name];]

在包说明部分声明的内容都是公有的,对应用程序是可见的。我们必须在所有的其他内容(除了用于为一个特殊的函数命名的编译指示;这样的编译指示必须跟在函数说明之后)声明之后才可以声明子程序。

包体中的内容有私有的,它实现了说明部分定义的细节内容,并且对应用程序是不可见的。紧跟着包体声明部分的是一个可选的初始化部分,它用于初始化包中的变量等。

AUTHID语句决定了是否是所有的打包子程序都按定义者权限(默认)或调用者权限执行,其中涉及到的模式对象是在定义者的模式中解析还是在调用者的模式中解析。

一个调用说明能让我们在Oracle数据词典中发布一个Java方法或外部C函数。调用说明靠把程序的名称、参数类型和返回类型映射到它们的SQL副本(SQL counterpart)中来发布程序。

1、       PL/SQL包举例

在下面的例子中,我们把一个记录类型、游标和两个employment过程进行打包。要注意,过程hire_employee使用数据库序列empno_seq和函数SYSDATE分别插入到字段雇员编号和雇佣日期。

CREATEORREPLACEPACKAGE emp_actions AS   -- spec

  TYPE emprectyp ISRECORD(

    emp_id   INT,

    salary   REAL

  );

 

  CURSOR desc_salary RETURN emprectyp;

 

  PROCEDURE hire_employee(

    ename    VARCHAR2,

    job      VARCHAR2,

    mgr      NUMBER,

    sal      NUMBER,

    comm     NUMBER,

    deptno   NUMBER

  );

 

  PROCEDURE fire_employee(emp_id NUMBER);

END emp_actions;

 

CREATEORREPLACEPACKAGEBODY emp_actions AS   -- body

  CURSOR desc_salary RETURN emprectyp IS

    SELECT   empno, sal

        FROM emp

    ORDERBY sal DESC;

 

  PROCEDURE hire_employee(

    ename    VARCHAR2,

    job      VARCHAR2,

    mgr      NUMBER,

    sal      NUMBER,

    comm     NUMBER,

    deptno   NUMBER

  ) IS

  BEGIN

    INSERTINTO emp

         VALUES (empno_seq.NEXTVAL,

                 ename,

                 job,

                 mgr,

                 SYSDATE,

                 sal,

                 comm,

                 deptno);

  END hire_employee;

 

  PROCEDURE fire_employee(emp_id NUMBER) IS

  BEGIN

    DELETEFROM emp

          WHERE empno = emp_id;

  END fire_employee;

END emp_actions;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值