1、包的定义

  1. 一个包由两个独立的部分组成--包头和包体。给部分被单独地存放在数据字典中。
  1. 1.1定义包头
  2. 语法:
  3. CREATE [OR REPLACE] PACKAGE [schema.] package
  4. {IS|AS}
  5. pl/sql_package;
  6.  
  7. package是包的名称
  8. pl/sql_package可以是存储过程、函数、变量、类型、异常以及游标的定义。
  9.  
  10. 存储过程或函数必须在包头中预定义。也就是说,在包头中定义存储过程名或函数名以及它们的参数,存储过程或函数的执行代码将在包体中定义。
  11.  
  12. CREATE OR REPLACE AuthsPack AS
  13. --获得auths表中作家的工资
  14. PROCEDURE QuerySalary(p_Code auths.author_code%TYPE,p_Salary auths.salary%TYPE);
  15. --向auths表插入记录
  16. PROCEDURE InsertAuthor(p_Code auths.author_code%TYPE,p_Name auths.name%TYPE);
  17. END AuthsPack;
  18.  
  19. 1.2定义包体
  20. 包体是一个数据字典对象。只有在包头成功编译后,包体才能被编译。包体只包含包头中已预定义的子程序的代码。在包头中定义的对象可以直接在包体中使用,不必再包头中定义。
  21.  
  22. CREATE [OR REPLACE] PACKAGE BODY [schema.] package
  23. {IS|AS}
  24. pl/sql_bady;
  25.  
  26. CREATE OR REPLACE PACKAGE BODY AuthsPack IS
  27. PROCEDURE QuerySalary(p_Code auths.author_code%TYPE,p_Salary auths.salary%TYPE)
  28. AS
  29. BEGIN
  30. SELECT salary INTO p_Salary
  31. FROM auths
  32. WHERE author_code= p_Code;
  33. END QuerySalary;
  34. PROCEDURE InsertAuthor(p_Code auths.author_code%TYPE,p_Name auths.name%TYPE);
  35. AS
  36. BEGIN
  37. INSERT INTO auths(author_code,name) VALUES(p_Code,p_Name);
  38. END InsertAuthor;
  39. END AuthsPack;
  40.  
  41. 如果包头不包含存储过程和函数,则不必定义包体。如果包头中有预定义的子程序,则在包体中必须编写其子程序代码,而且包头和包体两部分指定的子程序必须一致,这包括相同的子程序名,参数名和参数类型。
  42.  
  43. 1.3包的初始化
  44. 与变量类似,包也可以被初始化。只是初始化部分在包体的最后部分被定义。
  45.  
  46. 语法:
  47. CREATE OR REPLACE PACKAGE BODY package {IS|AS}
  48. --包体中过程与函数的定义部分
  49. BEGIN
  50. Initialization_code;--初始化代码
  51. --QuerySalary('A0001',v_Salary);
  52. END [package]

2、包的使用

  1. 2.1包中对象的引用
  2. 在包中定义的任意对象都可以再保外使用,只是在引用该对象前用包名做前缀。
  3.  
  4. --设置缓冲区大小
  5. SET SERVEROUTPUT ON SIZE 100000
  6. DECLARE
  7. v_Salary auths.salary%TYPE;
  8. BEGIN
  9. AuthsPack.QuerySalary('A0001',v_Salary);
  10. DBMS_OUTPUT.PUT_LINE('工资为:');
  11. DBMS_OUTPUT.PUT_LINE(v_Salary);
  12. END;
  13.  
  14. 此存储过程的调用有包名作前缀。包中存储过程的参数也可以有缺省值,这些参数可通过位置表示法或命名表示法来调用。在包体内部不必带包名前缀即可直接引用包头中的对象。
  15.  
  16. 2.2重载包中的子程序
  17. 在包的内部,存储过程和函数都可以被重载,这意味着有过个存储过程或函数可以使用同一个名称,但是参数不能相同。这样就允许用不同的参数调用同一个名字的过程或函数。
  18.  
  19. CREATE OR REPLACE AuthsPack AS
  20. PROCEDURE AddArticle(p_ArticleCode article.article_code%TYPE,
  21. p_AuthorCode article.author_code%TYPE);
  22. PROCEDURE AddArticle(p_Birthdate article.birthdate%TYPE,
  23. p_ArticleCode article.article_code%TYPE);
  24. END AuthsPack;
  25.  
  26. CREATE OR REPLACE PACKAGE BODY ArticlePack IS
  27. PROCEDURE AddArticle(p_ArticleCode article.article_code%TYPE,
  28. p_AuthorCode article.author_code%TYPE) AS
  29. BEGIN
  30. INSERT INTO Article(Article_code,Author_code)
  31. VALUES(p_ArticleCode,p_AuthorCode);
  32. END AddArticle;
  33. PROCEDURE AddArticle(p_Birthdate article.birthdate%TYPE,
  34. p_ArticleCode article.article_code%TYPE) AS
  35. BEGIN
  36. INSERT INTO Article(Birthdate,Article_code)
  37. VALUES(p_Birthdate,p_AuthorCode);
  38. END AddArticle;
  39. END ArticlePack;
  40.  
  41. 当仅仅参数名不同或者是模式不同时,不能重载子程序。
  42. 不能对仅有返回类型的函数进行重载。
  43. 重载函数的参数必须是数据类型不同或其类型间不可自动转换。
  44.  
  45. 在定义包含违反上述限制的子程序的包时不会包编译错误。但是,允许PL/SQL引擎不能调用该子程序,会出现错误"PLS-307:too many daclarations of ’subprogram match this call."

3、在SQL语句中使用函数

  

  

  

  

  

  

4、系统提供的包DBMS_OUTPUT

  Oracle8中,系统提供了一些包,这些包时在安装Oracle时自动安装的,用户可以直接使用。在内嵌包中有一个包经常用到--DBMS_OUTPUT,现在来简单地学习一下它。

  内嵌包DBMS_OUTPUT用来输出PL/SQL变量的值。DBMS_OUTPUT包和其他系统包一样,都属于Oracle系统用户SYS内的对象。

  

  

PL/SQL之包的更多相关文章

  1. PL/SQL之--包

    一.包 包是一组相关过程.函数.常量.变量.游标.异常等PL/SQL程序设计元素的组合.它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法.通过使用包,可以使开发 ...

  2. PL/SQL编程—包

    1.PLSQL 中的包就相当于java中的package,主要好处有(1)防止命名污染,(2)功能统一,(3)允许重载,(4)可以隐藏核心代码,(5)最重要的就是断开依赖链. 2.对于一个程序需要大量 ...

  3. PL/SQL 09 包 package

    --定义包头 create or replace package 包名as  变量.常量声明;  函数声明;  过程声明;end; --定义包体 create or replace package b ...

  4. Insert BLOB && CLOB from PL/SQL and JDBC

    For PL/SQL 1)Create Directory Where BLOB resides. create or replace directory temp as '/oradata2'; - ...

  5. Oracle基础(五)pl/sql进阶(分页过程)

    编写分页过程         通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...

  6. 使用集成SOA网关的PL / SQL中的REST

    使用集成SOA网关的PL / SQL中的REST Oracle电子商务套件集成SOA网关(ISG)是一款开箱即用的模块,支持在Oracle Integration Repository中发布支持的接口 ...

  7. Oracle PL/SQL入门之慨述

    Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...

  8. PL/SQL -->隐式游标(SQL%FOUND)

    PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...

  9. PL/SQL重新编译包无反应

    前几天碰到一个有趣的事情:早上同事执行一个包很久没有反应,就中断了执行,发邮件让我帮忙查看具体情况,我用PL/SQL Developer登录后,找到这个包的过程中发现这个包的图标有红色叉叉,也就是说这 ...

随机推荐

  1. WORD wFormatTag; /* format type */ //设置波形声音的格式

    0x0000   Microsoft   Unknown   Wave   Format       0x0001   Microsoft   PCM   Format       0x0002    ...

  2. linux中使用unzip命令中文乱码解决办法

    今天在使用unzip进行解压缩文件时,发现解压出的文件中文乱码,最后使用如下命令解决: unzip -O CP936 xxx.zip 特此记录一下.

  3. 516. Longest Palindromic Subsequence

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  4. IDEA中配置SpringMVC框架 第一个演示【转】

    环境: intellij IDEA 2017 CI JDK 1.8 tomcat 8.5.23 具体步骤 1.新建项目 勾选Spring MVC .Web Application(勾选了Spring ...

  5. loadrunner录制的基本知识

    1.http/html录制选择web_url,如下图所示: 开始录制->Options->Recording->HTML Advanced->选择web_url->OK ...

  6. LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)

    题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...

  7. URL的三类编码格式(JavaScript实现)

    编码函数: 1.escape():     不编码的字符有69个:*  +  -   .  /  @  _  0~9  a~z  A~Z     而且escape对0~255以外的Unicode值进行 ...

  8. 前端视频插件Aliplayer播放器简单使用(基于地址播放)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  9. python要点记录

    1.字典:当存储的key数目在几万到几十万之间效率最高.

  10. linux系统服务管理

    centos7的服务管理命令 systemctl start 服务名称 systemctl stop 服务名称 systemctl status 服务名称 systemctl restart 服务名称 ...