最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
oracle数据库对象-包PACKAGE用法
时间:2015-07-08 编辑:简简单单 来源:一聚教程网
程序包是ORACLE PL/SQL的一个特性,它就像是一个容器或者说是一个命名空间,可以将各种逻辑相关的类型、常量、变量、异常和子程序结合在一起。为开发人员编写大型复杂应用程序时,提供了一个良好的组织单元。
当定义好了程序包之后,应用程序就可以通过包来访问各种不同的功能单元,而不用担心过多零散的子程序导致程序代码的松散。
简化应用设计、提高应用性能、实现信息隐藏、子程序重载。
1、Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)?
你不觉得把存储过程分门别类是很重要的么,而且不同的package的存储过程可以重 名。
用package不仅能把存储过程分门别类,而且在package里可以定义公共的变量/类型,既方便了编程,又减少了服务器的编译开销。
2、如何把现有的存储过程加入到Package中?
copy and pasty,不过调用的时候要带包名了。
3、除了使用SQL Plus,还有没有什么工具做Package?
也有方便的第三方工具了,不过得自己找了。
用第三方工具吧,比如sql navigator。
4、使用SQL Plus编译Package,是否每次都是编译Package中所有的存储过程?
是包也是一种命名pl/sql块,和存储过程、函数一下,都是在数据库启动的时候就载入内存的。开销的大小很难判断,因为你不用包,但是要完成包的功能的话,还是要用PL/SQL来完成的,服务器一样有开销。相对来说,用包少了SQL的语法分析、解释过程,开销还少一点。
“过程一般都不超过20行”那我倒很少遇到。用不用子过程关键要看是不是能定义可重用的子过程,用子过程效率不会低。
包的作用:包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于一个容器.将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用,因此包为PL/SQL提供了全程变量.
包分为两部分:包头和包体.
如何创建包?
1)包头:
语法格式:
CREATE OR REPLACE PACKAGEpackage_name /*包头名称*/
IS|AS pl/sql_package_spec /*定义过程,函数以及返回类型,变量,常量及数据类型定义*/
定义包头应当遵循以下原则:
1)包元素位置可以任意安排.然而在声明部分,对象必须在引用前进行声明.
2)包头可以不对任何类型的元素进行说明.例如,包头可以只带过程和函数说明语句,而不声明任何异常和类型.
3)对过程和函数的任何声明都必须只对子程序和其参数进行描述,不能有任何代码的说明,代码的实现只能在包体中出现.它不同于块声明,在块声明中,过程和函数的代码可同时出现在声明部分.
2.包体:
语法格式:
CREATE OR REPLACE PACKAGE BODY package_name/*包名必须与包头的包名一致*/
IS | AS pl/sql_package_body /*游标,函数,过程的具体定义*/
包体是与包头相互独立的,包体只能在包头完成编译后才能进行编译.包体中带有包头中描述的子程序的具体实现的代码段.除此之外,包体还可以包括具有包体人全句属性的附加声明部分,但这些附加声明对于包头是不见的.
一个PL/SQL程序包包含如下两个部分组成:
·包规范:主要是包的一些定义信息,不包含具体的代码实现部分。
·包体:包体是对包规范中声明的子程序的实现部分,包体的内容对于外部应用程序来说是不可见的,包体就像是一个黑匣子一样,是对包规范的实现。
1、包规范基本语法
CREATE [OR REPLACE] PACKAGE PACKAGE_NAME
{IS | AS}
PACKAGE_SPECIFICATION
END PACKAGE_NAME;
例子:
--/
CREATE OR REPLACE PACKAGE pack_fun IS
--定义一个函数返回两个数的和
FUNCTION fun_add(num1 IN NUMBER, num2 IN OUT NUMBER) RETURN NUMBER;
--定义一个函数返回两个数的差
FUNCTION fun_sub(num1 IN NUMBER, num2 IN OUT NUMBER) RETURN NUMBER;
--定义一个存储过程显示九九乘法表
PROCEDURE proc_1;
END;
/
2、包体基本语法
CREATE [OR REPLACE] PACKAGE BODY PACKAGE_NAME
{IS | AS}
PACKAGE_BODY
END PACKAGE_NAME;
如果包体中的函数有一个修改了,就得全部重新编译。
--/
CREATE OR REPLACE PACKAGE BODY pack_fun IS
FUNCTION fun_add(num1 IN NUMBER, num2 IN NUMBER) RETURN NUMBER IS
tmp NUMBER;
BEGIN
tmp := num1 + num2;
RETURN tmp;
END fun_add;
FUNCTION fun_sub(num1 IN NUMBER, num2 IN NUMBER) RETURN NUMBER IS
tmp NUMBER;
BEGIN
tmp := num1 - num2;
RETURN tmp;
END fun_sub;
PROCEDURE proc_1 IS
M NUMBER := 0;
BEGIN
FOR I IN 1 .. 9 LOOP
FOR J IN 1 .. I LOOP
M := I * J;
DBMS_OUTPUT.PUT(I || '*' || J || '=' || M || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE(NULL);
END LOOP;
END proc_1;
END pack_fun;
/
3、调用包中的函数和存储过程
select pack_fun.fun_add(9,8) from dual;
select pack_fun.fun_sub(9,8) from dual;
--/
BEGIN
pack_fun.proc_1;
END;
/
相关文章
- oracle数据库datafile auto offlile due to i/o error 11-10
- oracle数据库10046的各种Case,方便trace信息的收集 11-10
- oracle数据库报错ora-600 [ktbdchk1: bad dscn] and ora-8103 corrupted block解决 08-18
- oracle数据库ORA-600 4194/ORA-600 4193/ORA-600 4137故障解决 08-11
- oracle数据库oradebug poke ORA-32521/ORA-32519故障解决 07-08
- oracle数据库12c的cluster中,dbs下指定spfile不生效 06-29