MogDB2.1版本开始支持创建PACKAGE。
使用PACKAGE的注意事项:
- 由于升级的限制,即使在不同的Package间,也无法创建同名同参的存储过程。
- package只支持集中式,无法在分布式中使用。
- 在package specification中声明过的函数或者存储过程,必须在package body中找到定义。
- 在实例化中,无法调用带有commit/rollback的存储过程。
- 不能在Trigger中调用package函数。
- 不能在外部SQL中直接使用package当中的变量。
- 不允许在package外部调用package的私有变量和存储过程。
- 不支持其它存储过程不支持的用法,例如,在function中不允许调用commit/rollback,则package的function中同样无法调用commit/rollback。
- 不支持schema与package同名。
- 只支持A风格的存储过程和函数定义。
- 不支持package内有同名变量,包括包内同名参数。
- package的全局变量为session级,不同session之间package的变量不共享。
- package中调用自治事务的函数,不允许使用公有变量,以及递归的使用公有变量的函数。
- package中不支持声明ref cursor类型。
CREATE PACKAGE语法:
CREATE PACKAGE SPECIFICATION语法格式
CREATE [ OR REPLACE ] PACKAGE [ schema ] package_name
[ invoker_rights_clause ] { IS | AS } item_list_1 END package_name;
invoker_rights_clause可以被声明为AUTHID DEFINER或者AUTHID INVOKER,分别为定义者权限和调用者权限。
item_list_1可以为声明的变量或者存储过程以及函数。
PACKAGE SPECIFICATION(包规格)声明了包内的公有变量、函数、异常等,可以被外部函数或者存储过程调用。在PACKAGE SPECIFICATION中只能声明存储过程,函数,不能定义存储过程或者函数。
CREATE PACKAGE BODY语法格式。
CREATE [ OR REPLACE ] PACKAGE BODY [ schema ] package_name
{ IS | AS } declare_section [ initialize_section ] END package_name;
PACKAGE BODY(包体内)定义了包的私有变量,函数等。如果变量或者函数没有在PACKAGE SPECIFICATION中声明过,那么这个变量或者函数则为私有变量或者函数。
PACKAGE BODY也可以声明实例化部分,用来初始化package
测试:
1.创建PACKAGE:
CREATE OR REPLACE PACKAGE package1 IS
O_SQLERROR varchar2(2000);
FUNCTION func1(num1 int,num2 int) RETURN int;
PROCEDURE proc1(i_num1 IN int,i_num2 IN int, O_RESULT OUT int, O_ERRCODE OUT varchar, O_ERROR OUT varchar) ;
end package1;
/
CREATE OR REPLACE PACKAGE BODY package1 IS
FUNCTION func1(num1 int,num2 int) RETURN int iS
func_result int;
BEGIN
func_result:= num1+num2;
O_SQLERROR :='00000';
RETURN func_result;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END ;
PROCEDURE proc1(i_num1 IN int,i_num2 IN int, O_RESULT OUT int, O_ERRCODE OUT varchar, O_ERROR OUT varchar) IS
BEGIN
o_result := i_num1 + i_num2;
O_ERRCODE := '0000';
O_ERROR := 'successful completion';
O_SQLERROR :='11111';
EXCEPTION
WHEN OTHERS THEN
O_ERRCODE := SQLSTATE;
O_ERROR := SQLERRM;
END ;
end package1;
/
测试执行包中的存储过程和函数:
测试结果:
ora_proc=> call package1.proc1(1,2,a,b,c);
o_result | o_errcode | o_error
----------+-----------+-----------------------
3 | 0000 | successful completion
(1 row)
ora_proc=> select package1.func1(1,2);
func1
-------
3
(1 row)
2.已在PACKAGE中定义的存储过程/函数,不能和在其他PACKAGE中定义的存储过程/函数同名且同参数,也不能和不是在PACKAGE中定义的存储过程/函数同名且同参数。
ora_proc=> create or replace FUNCTION func1(num1 int,num2 int) RETURN int package IS
ora_proc$> func_result int;
ora_proc$> BEGIN
ora_proc$> func_result:= num1+num2;
ora_proc$> RETURN func_result;
ora_proc$> EXCEPTION
ora_proc$> WHEN OTHERS THEN
ora_proc$> RETURN NULL;
ora_proc$> END ;
ora_proc$> /
ERROR: Due to upgrade mode,Do not allow different package have same function name with same parameter,please drop package by oid 17309 first
ora_proc=> create or replace FUNCTION func1(num1 int,num2 int,num3 int) RETURN int iS
ora_proc$> func_result int;
ora_proc$> BEGIN
ora_proc$> func_result:= num1+num2 +num3;
ora_proc$> RETURN func_result;
ora_proc$> EXCEPTION
ora_proc$> WHEN OTHERS THEN
ora_proc$> RETURN NULL;
ora_proc$> END ;
ora_proc$> /
CREATE FUNCTION
最后修改时间:2022-04-07 14:52:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




