Skip to content

创建程序包

一个包对象结构包括:包规范(包头)与包体。

包头定义了包对象所有的公有元素信息,可包括游标、数据类型、存储过程/函数等元素。

包体是对包头定义的具体实现,在包体内定义公有存储过程或存储函数的执行体。同时包体内还可以声明包的私有元素,声明的游标、变量、用户类型等在包头内未定义,则这些对象为私有对象,用户不可通过包进行访问,但可在包体内进行调用。

包头定义

语法格式

sql
packdecl::=
    CREATE [FORCE | OR REPLACE | OR REPLACE FORCE] PACKAGE name_space 
    [AUTHID DEFAULT | AUTHID CURRENT_USER | AUTHID DEFINER] 
    [COMMENT SCONST] 
    {IS | AS} PackSpecItem [PackSpecItem]...
    END [name_space]

PackSpecItem::=
    VarDef ;
|   ProcDecl ;

参数说明

  • name_space:创建包时为创建的包名,声明公有存储函数/过程时为声明的函数/过程名,定义变量时为定义的变量名等。
  • VarDef ;:变量定义。详细信息请参见PL/SQL语言 > PL/SQL语法章节的DECLARE声明部分。
  • ProcDecl ;: 过程或函数的声明。详细信息请参见存储过程/函数管理 > 创建存储函数/创建存储过程子章节语法格式部分。

说明:

在包头定义中,针对存储过程与函数的定义可通过重载的方式实现不同输入参数的同名过程/函数声明。

包体创建

语法格式

sql
PackBody::=
    CREATE [FORCE | OR REPLACE | OR REPLACE FORCE] PACKAGE BODY name_space 
    {IS | AS} 
    [[DECLARE] VarDefList] 
    PackMemberProcs 
    [BEGIN pl_stmt_list] 
    EXCEPTION Exception_Item [Exception_Item]...
    END [name_space]

VarDefList::=
    VarDef ;
|   VarDefList VarDef ;

PackMemberProcs::=
    ProcDef ;
|   PackMemberProcs ProcDef ;

参数说明

  • VarDefList:定义私有变量和常量,它们只能在包体内访问,不能从包外部直接访问。详细信息请参见PL/SQL语言 > PL/SQL语法章节的DECLARE声明部分。
  • pl_stmt_list:PL/SQL语句列表,包含初始化逻辑。详细信息请参见PL/SQL语言 > PL/SQL语法章节的BEGIN...END块部分。
  • Exception_Item: 异常处理项,可以是一个或多个异常处理块。每个块定义了当特定异常发生时应执行的操作。详细信息请参见PL/SQL语言 > 异常处理语句章节。
  • PackMemberProcs:实现包头中声明的对象如过程、存储函数的过程体或函数体。详细信息请参见存储过程/函数管理 > 创建存储函数/创建存储过程子章节语法格式部分。

说明:

在包体内声明与定义的对象在包头内若无声明,则对象为私有元素对象,这类元素对象只能在包体内调用,用户无法通过包进行访问使用。

示例

创建一个封装了一个存储过程的pack_test包,存储过程实现了输出DBA_TABLES系统表中表名的功能。调用该包可使用命令EXEC pack_test.proc1

sql
-- 创建包头:
CREATE OR REPLACE PACKAGE pack_test IS
  PROCEDURE proc1();
END;
/

-- 创建包体:
CREATE OR REPLACE PACKAGE body pack_test IS
  PROCEDURE proc1() IS
    CURSOR mycur IS
      SELECT table_name FROM dba_tables;
    con  INTEGER;
    name VARCHAR;
  BEGIN
    SELECT count(*) INTO con FROM dba_tables;
    OPEN mycur;
    FOR i IN 1 .. con LOOP
      FETCH mycur
        INTO name;
      send_msg(name);
    END LOOP;
    close mycur;
  END;
END;
/