PL/SQL之包
1、包的定义
一个包由两个独立的部分组成--包头和包体。给部分被单独地存放在数据字典中。
1.1定义包头
语法:
CREATE [OR REPLACE] PACKAGE [schema.] package
{IS|AS}
pl/sql_package; package是包的名称
pl/sql_package可以是存储过程、函数、变量、类型、异常以及游标的定义。 存储过程或函数必须在包头中预定义。也就是说,在包头中定义存储过程名或函数名以及它们的参数,存储过程或函数的执行代码将在包体中定义。 CREATE OR REPLACE AuthsPack AS
--获得auths表中作家的工资
PROCEDURE QuerySalary(p_Code auths.author_code%TYPE,p_Salary auths.salary%TYPE);
--向auths表插入记录
PROCEDURE InsertAuthor(p_Code auths.author_code%TYPE,p_Name auths.name%TYPE);
END AuthsPack; 1.2定义包体
包体是一个数据字典对象。只有在包头成功编译后,包体才能被编译。包体只包含包头中已预定义的子程序的代码。在包头中定义的对象可以直接在包体中使用,不必再包头中定义。 CREATE [OR REPLACE] PACKAGE BODY [schema.] package
{IS|AS}
pl/sql_bady; CREATE OR REPLACE PACKAGE BODY AuthsPack IS
PROCEDURE QuerySalary(p_Code auths.author_code%TYPE,p_Salary auths.salary%TYPE)
AS
BEGIN
SELECT salary INTO p_Salary
FROM auths
WHERE author_code= p_Code;
END QuerySalary;
PROCEDURE InsertAuthor(p_Code auths.author_code%TYPE,p_Name auths.name%TYPE);
AS
BEGIN
INSERT INTO auths(author_code,name) VALUES(p_Code,p_Name);
END InsertAuthor;
END AuthsPack; 如果包头不包含存储过程和函数,则不必定义包体。如果包头中有预定义的子程序,则在包体中必须编写其子程序代码,而且包头和包体两部分指定的子程序必须一致,这包括相同的子程序名,参数名和参数类型。 1.3包的初始化
与变量类似,包也可以被初始化。只是初始化部分在包体的最后部分被定义。 语法:
CREATE OR REPLACE PACKAGE BODY package {IS|AS}
--包体中过程与函数的定义部分
BEGIN
Initialization_code;--初始化代码
--QuerySalary('A0001',v_Salary);
END [package]
2、包的使用
2.1包中对象的引用
在包中定义的任意对象都可以再保外使用,只是在引用该对象前用包名做前缀。 --设置缓冲区大小
SET SERVEROUTPUT ON SIZE 100000
DECLARE
v_Salary auths.salary%TYPE;
BEGIN
AuthsPack.QuerySalary('A0001',v_Salary);
DBMS_OUTPUT.PUT_LINE('工资为:');
DBMS_OUTPUT.PUT_LINE(v_Salary);
END; 此存储过程的调用有包名作前缀。包中存储过程的参数也可以有缺省值,这些参数可通过位置表示法或命名表示法来调用。在包体内部不必带包名前缀即可直接引用包头中的对象。 2.2重载包中的子程序
在包的内部,存储过程和函数都可以被重载,这意味着有过个存储过程或函数可以使用同一个名称,但是参数不能相同。这样就允许用不同的参数调用同一个名字的过程或函数。 CREATE OR REPLACE AuthsPack AS
PROCEDURE AddArticle(p_ArticleCode article.article_code%TYPE,
p_AuthorCode article.author_code%TYPE);
PROCEDURE AddArticle(p_Birthdate article.birthdate%TYPE,
p_ArticleCode article.article_code%TYPE);
END AuthsPack; CREATE OR REPLACE PACKAGE BODY ArticlePack IS
PROCEDURE AddArticle(p_ArticleCode article.article_code%TYPE,
p_AuthorCode article.author_code%TYPE) AS
BEGIN
INSERT INTO Article(Article_code,Author_code)
VALUES(p_ArticleCode,p_AuthorCode);
END AddArticle;
PROCEDURE AddArticle(p_Birthdate article.birthdate%TYPE,
p_ArticleCode article.article_code%TYPE) AS
BEGIN
INSERT INTO Article(Birthdate,Article_code)
VALUES(p_Birthdate,p_AuthorCode);
END AddArticle;
END ArticlePack; 当仅仅参数名不同或者是模式不同时,不能重载子程序。
不能对仅有返回类型的函数进行重载。
重载函数的参数必须是数据类型不同或其类型间不可自动转换。 在定义包含违反上述限制的子程序的包时不会包编译错误。但是,允许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之包的更多相关文章
- PL/SQL之--包
一.包 包是一组相关过程.函数.常量.变量.游标.异常等PL/SQL程序设计元素的组合.它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法.通过使用包,可以使开发 ...
- PL/SQL编程—包
1.PLSQL 中的包就相当于java中的package,主要好处有(1)防止命名污染,(2)功能统一,(3)允许重载,(4)可以隐藏核心代码,(5)最重要的就是断开依赖链. 2.对于一个程序需要大量 ...
- PL/SQL 09 包 package
--定义包头 create or replace package 包名as 变量.常量声明; 函数声明; 过程声明;end; --定义包体 create or replace package b ...
- Insert BLOB && CLOB from PL/SQL and JDBC
For PL/SQL 1)Create Directory Where BLOB resides. create or replace directory temp as '/oradata2'; - ...
- Oracle基础(五)pl/sql进阶(分页过程)
编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...
- 使用集成SOA网关的PL / SQL中的REST
使用集成SOA网关的PL / SQL中的REST Oracle电子商务套件集成SOA网关(ISG)是一款开箱即用的模块,支持在Oracle Integration Repository中发布支持的接口 ...
- Oracle PL/SQL入门之慨述
Oracle PL/SQL入门之慨述 一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言( ...
- PL/SQL -->隐式游标(SQL%FOUND)
PL/SQL -->隐式游标(SQL%FOUND) 分类: SQL/PLSQL 基础2010-12-22 16:23 4084人阅读 评论(0) 收藏 举报 sqlexceptionoracle ...
- PL/SQL重新编译包无反应
前几天碰到一个有趣的事情:早上同事执行一个包很久没有反应,就中断了执行,发邮件让我帮忙查看具体情况,我用PL/SQL Developer登录后,找到这个包的过程中发现这个包的图标有红色叉叉,也就是说这 ...
随机推荐
- 虚拟机安装MAC OS X 10.9与Windows 7共享文件夹的方法
在虚拟机中安装好MAC OS X后, 把CD/DVD中的ISO映像换成 VMwareWorkstation安装目录下的/darwin.iso, 然后连接上 进入MAC 系统后, 先安装vmware t ...
- java—不同的用户登录以后可以看到不同的菜单(后台可以实现对用户菜单的管理) 1 (55)
实现不同的用户登录以后可以看到不同的菜单.(后台可以实现对用户菜单的管理.) 第一步:分析数据结构 1:用户表 表名:users 列名 类型 说明 id Varchar(32) 主键 n ...
- ocp认证052最新题库-收集整理中-1
1..Which two are true about the Archive (ARCn) processes?❑ A) They automatically delete obsolete arc ...
- httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond 错误原因和解决方法
原因:httpclient 之前与服务端建立的链接已经失效(例如:tomcat 默认的keep-alive timeout :20s),再次从连接池拿该失效链接进行请求时,就会保存. 解决方法:官方链 ...
- Python数据分析之文本处理词频统计
1.项目背景: 原本计划着爬某房产网站的数据做点分析, 结果数据太烂了,链家网的数据干净点, 但都是新开楼盘,没有时间维度,分析意义不大. 学习的步伐不能ting,自然语言处理还的go on 2.分析 ...
- PHP中运算符优先级
运算符优先级指定了两个表达式绑定得有多“紧密”.例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(“*”)的优先级比加号(“+”)高.必要时可以用括号来强制改变优先级.例如: ...
- 【bug】—— IE8 ajax 报错:no transport
如题,我使用$.ajax()方法请求数据,在现代浏览器中工作正常,但在 IE 8 下,会有报错:no transport 从 stackoverflow 中获知,出现这个问题是因为** IE 8 不支 ...
- [转] LVM分区在线扩容
[转] LVM分区在线扩容 在线扩容的这台服务器,LV分区格式为xfs,原大小1.2TB.增加了一块硬盘,大小为1.8TB. fdisk /dev/cciss/c0d1 # 创建分区,并指定分区类型为 ...
- git命令合集及github的克隆推送
安装git 初始化仓库 提交相关 撤销相关 远程推送 分支相关 其他 遇到的错误 github的克隆上传 此文章只是对命令的一个统计,起备忘和复习git只是的作用,不建议从没接触过git的同学通过它来 ...
- python------对于面向对象的理解
python中一切皆为对象 其实面向对象没什么高大上的东西,只不过把我们平时对于事物的描述和动作系统的总结成了一个定义事物的方法而已. 我们平时向别人介绍一个他(她)从未见过的东西,会从外形和外貌特征 ...