`

create oracle package

阅读更多
一、程序包的相关知识
1.定义与说明
  a. 相关对象的封装
  b. 程序包的各部分
    - 程序包规格说明
          声明子程序
   - 程序包主体
          定义子程序

2.使用程序包的优点
  - 模块化
  - 更轻松的应用程序设计
  - 信息隐藏
  - 新增功能
  - 性能更佳

3.公有项和私有项的区别
公有项:在程序包说明部分定义的变量、过程、函数
私有项:在程序包主体部分定义的变量、过程、函数

公有项                          私有项
可以在程序包之外引用         不能在程序包之外引用
是在程序包规格说明中定义的   是在程序包主体中定义的
用于全局目的                 用于局部目的

二、程序包创建说明
1.程序包规格说明
    (1)、使用Create Package命令进行创建
    (2)、包含公用对象和类型
    (3)、声明类型、常量、变量、异常、游标和子程序
    (4)、可以在没有程序包主题的情况下存在
    (5)、可以重载
        - 程序包中的多个子程序可以具有相同的名称
        - 它们的形参是不同的
        - 只能位于打包的子程序中
        - 限制
           a. 如果子程序的参数仅名称或模式不同,则不能重载
           b. 不能基于其返回类型重载子程序

2.程序包主体
    (1)、使用Create Package body 命令进行创建
    (2)、包含子程序和游标的定义
    (3)、包含私有声明
    (4)、不能在没有程序包规格说明的情况下独立存在

3.程序包的调用
    包名.类型名;
    包名.函数名[参数表];
    包名..过程名[参数表];
    (1)、 Package-name.type-name
    (2)、 Package-name.object-name 
    (3)、 Package-name.subprogram-name
     其中,Package-name 是程序包名称,type-name是类型名称,
           object-name是对象名称,subprogram-name 是子程序名称
   --示例
     DBMS_output.put_line(Hello);
    (4)、对于返回参数是游标类型的调用(如:引用游标)
       set  autoprint on  --打开Sqlplus输出
       variable tempCur RefCursor;  --定义一个宿主类型的引用游标变量
       exec StudentPackage.ReturnStudent(:tempCur);  --执行带有引用游标的过程 注意使用宿主类型的变量前面要加“:”符号

4. 有关子程序和程序包的信息
   A.数据字典
    User_objects  用于检查对象是否存在
    User_source   用于获取对象的代码

   B. 包的修改和删除
     Alter Package [Body] 包名
     Alter Package Body StudentPackage;
     Drop  Package [Body] 包名
     Drop  Package Body StudentPackage;

5. 创建格式
  A.创建包规格部分
   格式:Create [or replace] Package 包名
         IS|AS
          变量声明;
          类型定义;
          异常声明;
          游标声明;
          函数说明;
          过程说明;
          Pragma restrict_references(过程名或函数名,WNDS[,WNPS][,RNDS][,RNPS]) --编译指令 限定函数的操作
        End [包名];

  B.创建包主体部分
   格式: Create [or replace] package body 包主体名 --包主体名一定要是已经定义的包名
        IS|AS 
        变量声明;   --具体的实现部分
        类型定义;
        异常声明;
        游标声明;
        函数说明;
        过程定义;
        End [包主体名];
   
6. 示例

示例1.创建程序包的规格说明部分
   Create or replace Package StudentPackage
   is
     Type curRefStudent is  Ref Cursor Return Student%rowtype;
     Procedure SelectStudent(FindID in Student.stuid%type);
     Procedure InsertStudent(NewStudent in Student%rowType);
     Procedure UpdateStudent(NewStudent in Student%rowType);
     Procedure DeleteStudent(DelID in Student.stuid%type);
     Procedure ReturnStudent(inOutstu in out curRefStudent);
     Function  RegurnRecordCount Return Number;
  End studentPackage;
示例2.创建程序包的主体部分
   Create or replace Package Body StudentPackage IS
   Procedure SelectStudent(FindID in Student.stuid%type) as  --注意没有Create
   /*实现查询过程的定义*/
    Cursor findCur is select * from student where stuid=FindID;
   Begin
      For S in FindCur Loop
         DBMS_output.put_line(S.stuID||' '||s.StuName||' '||S.Sex);
      End Loop;
   Exception
     When No_Data_Found Then
       DBMS_output.Put_Line('没有查到ID为'||FindID||'的记录!');
     When Others Then
       DBMS_output.Put_Line('查询过程中发生意外情况');
   End SelectStudent;  --结束查询过程

   /*实现插入过程的定义*/
   Procedure InsertStudent(NewStudent in Student%rowType) as
    iRec Integer;
    Not_Exists_Student Exception;  --预定义异常
    Begin
       Select count(*) into iRec from student where stuid=NewStudent.stuID;
       IF iRec>0 Then
       Raise Not_Exists_Student;
       Else
       insert into student values(NewStudent.stuid,NewStudent.stuName,NewStudent.sex);
       commit;
       End IF;
    Exception
     When Not_Exists_Student Then
       DBMS_output.Put_Line('要插入的编号:'||NewStudent.stuid||'的记录已经存在');
     When Others Then
       DBMS_output.Put_Line('插入记录操作过程中出现错误');
    End InsertStudent;--结束插入过程

   /*实现更新过程的定义*/
   Procedure UpdateStudent(NewStudent in Student%rowType) as
   iRec Integer;
   Begin
      select Count(*) into iRec From student Where stuid=NewStudent.stuid;
      IF iRec =0 Then
         DBMS_output.Put_Line('编号为:'||NewStudent.stuid||'的记录不存在,修改失败');
      ELSE
         Update student Set Stuname=NewStudent.stuName,Sex=NewStudent.Sex
         WHERE stuid=NewStudent.stuID;
         Commit;
     End IF;
   Exception
       When No_Data_Found Then
          DBMS_output.Put_Line('编号为:'||NewStudent.stuID||'的记录不存在,修改失败');
       When Others Then
           DBMS_output.Put_Line('执行修改操作时发生意外情况,修改未成功');
   End  UpdateStudent;--结束修改过程

   /*实现删除过程的定义*/
   Procedure DeleteStudent(DelID in Student.stuid%type) as
     iRec Integer;
   Begin
      Select Count(*) into iRec From Student Where stuID=DelID;
      IF iRec=0 Then
        DBMS_output.Put_Line('编号为:'||DelID||'的记录不存在,删除操作时未成功');
      ELSE
        Delete From student Where   stuid=DelID;
        Commit;
         DBMS_output.Put_Line('删除成功!');
      End IF;
   Exception
     When Others Then
          DBMS_output.Put_Line('执行删除操作时发生意外情况,删除未成功');
   End DeleteStudent;
  
    /*实现参数带有游标类型定义*/
    Procedure ReturnStudent(inOutstu in out curRefStudent) as
    Begin
        Open inOutstu For Select * from student;
    End ReturnStudent;

   /*实现函数定义*/
    Function RegurnRecordCount Return Number as
      RecCount number(10);
    Begin
       Select Count(*) into RecCount From student;
       Return recCount;
    Exception
       When Others Then
        DBMS_output.Put_Line('查询表中记录数时发生意外情况');
    End RegurnRecordCount; --结束函数的定义
   End  studentPackage;--结束包   

示例3:调用包
    1. 调用studentPackage包中的InsertStudent过程
      Declare
         newStu  Student%RowType;
      Begin
         newStu.stuID:='1001';
         newStu.stuName:='张三';
         newStu.sex:='男';
         studentPackage.InsertStudent(newStu);
      End;
      /
   2. 调用studentPackage包中的UpdateStudent过程
      Declare
          newStu Student%RowType;
      Begin
          newStu.stuID:='1001';
          newStu.stuName:='李四';
          newStu.sex:='女';
          studentPackage.UpdateStudent(newStu);
      Exception
          When Dup_Val_On_Index Then
            DBMS_output.Put_Line('唯一约束被破坏');
          When Others Then
            DBMS_output.Put_Line('更新过程出现错误');
      End;
       /
   3. 调用studentPackage包中的DeleteStudent过程
     Begin
          studentPackage.DeleteStudent('1001');
     End;
     /
   4. 调用studentPackage包中的ReturnRecordCount函数
     Begin
         DBMS_output.put_Line(studentPackage.ReturnRecordCount);
     End;
     /

分享到:
评论

相关推荐

    Oracle package

    ### Oracle Package 和 Package Body 使用详解 #### 一、Oracle Package 概念介绍 在Oracle数据库中,`Package` 是一种非常强大的工具,它允许开发者将相关的数据类型、常量、变量、游标、子程序(过程和函数)等...

    oracle汉字转拼音package包-支持UTF8

    导入过程通常是通过SQL*Plus或其他数据库管理工具执行这个SQL脚本,执行CREATE或ALTER语句来创建或更新Package。 在实际应用中,我们可以通过以下方式调用这些函数: ```sql DECLARE pinyin VARCHAR2(4000); ...

    Oracle数据库Package

    Oracle数据库中的Package是一种高级的模块化编程工具,它允许开发者将相关的过程、函数、变量和类型等编程元素组合在一起,形成一个逻辑上的整体。Package在Oracle数据库系统中扮演着重要的角色,提供了更好的代码...

    oracle package汉字转拼音 简拼

    使用上述`oracle汉字转拼音package_获得全拼——拼音首字母_拼音截取等.sql`文件,可能包含的就是创建这样一个存储过程或包的SQL脚本。脚本中可能定义了以下过程: ```sql CREATE OR REPLACE AND COMPILE JAVA ...

    oracle权限管理

    GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SEQUENCE, CREATE TYPE TO YZHQ WITH ADMIN OPTION; ``` - 这条命令将上面列出的所有系统权限授予了用户`YZHQ`。 - `WITH ADMIN ...

    java链接oracle数据库生成xml文件

    Document doc = DocumentHelper.createDocument(); Element rootElement = doc.addElement("root"); // 创建根元素 while (rs.next()) { Element record = rootElement.addElement("record"); // 添加子元素,值...

    怎么用oracle打包

    CREATE OR REPLACE PACKAGE PKG_ORDERS AS -- 声明公共变量 l_order_id NUMBER; -- 定义公共过程 PROCEDURE create_order(p_customer_id NUMBER, p_order_date DATE); -- 定义公共函数 FUNCTION get_order...

    Oracle Solaris 11 Copying and Creating Oracle Solaris11 Package

    2. 创建仓库结构:使用`pkgrepo create`命令初始化仓库的元数据结构。 3. 添加软件包:使用`pkg publish`命令将软件包和它们的元数据添加到仓库中。这可能包括从源代码构建的自定义包或从其他仓库导入的软件包。 4...

    Pipelined 是Oracle的一个关键字

    CREATE OR REPLACE PACKAGE BODY myDemoPack AS FUNCTION prodFunc RETURN myTableType PIPELINED IS BEGIN FOR i IN 1..5 LOOP PIPEROW(myObjectFormat(i, SYSDATE + i, 'Row' || i)); END LOOP; RETURN; ...

    oracle对象创建实例

    CREATE OR REPLACE PACKAGE BODY package_name AS -- 定义私有变量和实现公共接口 PROCEDURE proc_name (param_list) AS BEGIN -- PL/SQL代码 END proc_name; FUNCTION func_name (param_list) RETURN ...

    龙蜥anolis系统oracle11g安装包

    3. 解压并安装RPM包:Oracle 11g的安装文件可能以RPM(Red Hat Package Manager)格式提供,脚本会负责解压和安装这些包。 4. 创建数据库实例:包括设置SID、创建目录结构、初始化参数文件等。 5. 用户权限配置:为...

    oracle学习笔记

    本文将深入探讨Oracle中的几个关键概念,如Package、Function、Procedure以及它们在Oracle数据库中的使用。 首先,让我们了解一下Oracle Package的作用。Package的主要目标是简化应用设计,通过将相关的过程、函数...

    C# 传入自定义列表List 到Oracle存储过程

    在.NET开发中,C#与Oracle数据库的交互是常见的任务,特别是当需要处理大量数据时,存储过程可以提供更高的性能和灵活性。本文将详细讲解如何在C#中使用自定义列表(List)作为参数调用Oracle存储过程,以及实现这一...

    Oracle Solaris 11.2 Copying and Creating Package Repositories in

    在Oracle Solaris 11.2中,复制和创建软件包仓库(Package Repositories)是系统管理和维护的重要环节,这允许系统管理员有效地分发、更新和管理软件包。 复制软件包仓库通常是出于备份目的或为了在网络中的多台...

    一个简单的oracle过程被使用的例子,包含架包

    CREATE OR REPLACE PACKAGE BODY package_name AS -- 体:实现过程和函数 PROCEDURE procedure_name (parameter_list) IS BEGIN -- 实现过程 END procedure_name; FUNCTION function_name (parameter_list) ...

    oracle创建各种对象

    CREATE OR REPLACE PACKAGE BODY my_package AS -- 实现过程和函数 END my_package; ``` 8. **类型(Type)**:自定义数据类型允许创建特定于应用的数据结构。创建类型: ```sql CREATE TYPE my_type AS ...

    水晶报表连接oracle存储过程实例

    CREATE OR REPLACE PACKAGE Test_Package AS TYPE Test_Type IS REF CURSOR; END Test_Package; 最后,需要创建一个 Oracle 存储过程,用于从 Test0 表中检索数据。在这个示例中,我们创建了一个名为 Test_...

    Oracle课程实训

    CREATE OR REPLACE PACKAGE MY_PACKAGE AS TYPE type_ref_cur IS REF CURSOR; PROCEDURE student_by_page( page IN NUMBER, count IN NUMBER, v_cur OUT MY_PACKAGE.type_ref_cur ); END MY_PACKAGE; / ``` ...

    oracle实现带参数视图

    CREATE OR REPLACE PACKAGE pkg_pv IS PROCEDURE set_pv(pv VARCHAR2); FUNCTION get_pv RETURN VARCHAR2; END; / CREATE OR REPLACE PACKAGE BODY pkg_pv IS v VARCHAR2(20); PROCEDURE set_pv(pv VARCHAR2) ...

Global site tag (gtag.js) - Google Analytics