`

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权限管理

    oracle权限管理 GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SEQUENCE, CREATE TYPE TO YZHQ WITH ADMIN OPTION; 收回 REVOKE CREATE SESSION, CREATE TABLE, CREATE VIEW, ...

    Oracle P/L SQL实现FTP上传、下载功能

    Create or Replace Package UTL_FTP AUTHID CURRENT_USER as Type Connection is Record( Connection UTL_TCP.Connection, AccountInfo VarChar2(1000), TransferMethod Char(1), --A: ASCII...

    oracle实验报告

    E:\app\oracle\admin\mydb\create E:\app\oracle\oradata\mydb 3、创建初始化参数文件:(特权模式) create pfile from spfile; mydb.__db_cache_size=348127232 mydb.__java_pool_size=12582912 mydb.__...

    jdbc连接oracle

    package com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DB { private static Connection conn; private static String url="jdbc:oracle...

    oracle汉字转化拼音

    oracle汉字转化拼音 CREATE OR REPLACE package GetHZPY is -- Author : ADMINISTRATOR -- Created : 2006-10-8 上午 11:51:16 -- Purpose : 获得汉字拼音编码

    Oracle_PLSQL_语法详细手册

    oracle_PLSQL_语法详细手册 目 录 第一部分 SQL语法部分 3 一、 CREATE TABLE 语句 3 二、 CREATE SEQUENCE语句 5 三、 CREATE VIEW语句 6 四、 INSERT语句: 7 五、 UPDATE语句: 9 六、 DELETE语句: 10 七、 ...

    性能调优分析之:Oracle SQL执行计划报告生成器

    Oracle SQL执行计划分析器功能的创建3步曲: 1 首先,编译XYG_ALD_SESS_PKG的Package头。 (XYG_ALD_SESS_PKG.sql) 2 接着要建立好下面的4个视图对象。因为XYG_ALD_SESS_PKG包体会用到。(View Create Script v...

    Oracle P/L SQL实现文件压缩、解压功能

    Create or Replace Package UTL_ZIP AUTHID CURRENT_USER as Type File_List is Table of Clob; --文件变成流 Function f_File2Blob( as_SubDir in VarChar2, as_FileName in VarChar2 )Return ...

    Oracle8i_9i数据库基础

    第一部分 Oracle SQL*PLUS基础 23 第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24...

    Oracle 存储过程教程

    Oracle分页存储过程的思路于sqlserver的思路是一样的,但是我这里做了点改动,在因为Oracle的语法和规则的不同所以,Oracle... 代码如下: create or replace package DotNet is — Author : good_hy — Created : 200

    OCP 082试题-2022.5.2更新.docx

    Which two statements are true about Oracle synonyms? A.A synonym can be created on an object in a package B.A synonym can have a synonym C.Any user can create a PUBLIC synonym D.A synonym has an ...

    利用 Oracle 和 PHP 管理分布式跟踪文件

    ‘your user_dump_dest‘, ‘read‘) create a wrapper package for utl_file pk_utl_file.sql As TFMADMIN set up the tables, views and sequence tfmadmin_objects.sql create the controlling package pack_...

    Oracle创建带有参数的视图代码介绍

    在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们...create or replace package p_view_param is --参数一 function set_param(num number) return number; function get_param return number;

    Oracle中返回结果集的存储过程分享

    实际上是利用REF CURSOR 代码如下: –procedure返回记录集: ———————-声明一个Package————– CREATE OR REPLACE PACKAGE pkg_test AS TYPEmyrctypeIS REF CURSOR; PROCEDURE get_r(p_id NUMBER,p_rc OUT ...

    Oracle JOB 用法小结

     二,dbms_job package 用法介绍  包含以下子过程:    Broken()过程。  change()过程。  Interval()过程。  Isubmit()过程。  Next_Date()过程。  Remove()过程。  Run()过程。  Submit()过程...

    oracle恢复工具-FY_Recover_Data

    首先要停止数据库, 将这个表所在的表空间的文件拷贝出来, 因为Oracle在Truncate只时将相应Segment的第一个块格式化掉了, 而后面的都还存在, 到下次用时到才真正地重新格式化. 下面来讲一个Truncate表后进行恢复的...

    彻底搞清楚library cache lock的成因和解决方法

    还有一种情况,当我们使用create or replace procedure/function等语句修改Procedure和Function的时候,会话也会hang住,这是为什么呢? 当出现上述情况的时候,我们可以通过v$session_wait查询等待事件,当然,...

    Oracle 10g 开发与管理

    (1)Create Table 表名 27 (2)在原来已有表上建一个新表(结构和数据) 27 (3)使用OEM建表 27 3.默认值和NULL值 27 三. 修改表 28 四. 删除表 28 五. 数据完整性 28 1.Primary Key 约束 28 2.NOT NULL约束 ...

    PL/SQL中编写Oracle数据库分页的存储过程

    其实 Oracle数据库的分页还是比较容易理解的。此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一...create or replace package pagingPackage as type paging_cursor is ref cursor; end pagingPa

    advanced oracle pl-sql

    Chapter 1, PL/SQL Packages describes how and when you should create packages and explains why PL/SQL developers should learn to center their entire development process around packages Chapter 2, Best...

Global site tag (gtag.js) - Google Analytics