lightdb新特性--兼容oracle存储过程--包package

包概述    

    包是一个模式对象,它对逻辑上的 类型、变量、常量、子程序、游标和异常进行分组。包被编译并存储在数据库中,应用程序可以在数据库中可以共享其内容。

    包由包规范(Specification) 和包体(Body) 两部分组成, 在数据库中独立存储。 其中,规范声明了可以从包外部引用的公共项。如果公共项包含游标或子程序,则包也必须具有主体。主体必须定义公共游标的查询和公共子程序的代码。主体还可以声明和定义私有项,这些私有项不能从包外部引用,但是对于包的内部工作是必需的。最后,主体可以有一个初始化部分(其语句初始化变量并执行其他一次性设置步骤)和一个异常处理部分。

     利用包可以实现代码复用, 提高程序的可靠性、 可维护性以及应用程序的开发效率。

包规范

    包规范声明了包中的公共元素的作用域为包所在的模式。 在包规范中声明的元素不仅可以在包的内部使用, 也可以被应用程序调用。 如果要在包的作用域内引用一个不可见的公用元素, 需要使用包名限制包中的公共元素, 即 包名 . 公共元
素名
在包规范中可以定义的公共元素包括:

  • Functions
  • Procedures
  • Cursors
  • Types
  • Variables
  • Constants
  • Record types


创建包规范语法如下:


包体

    如果包规范中声明了游标( 游标没有定义) 或子程序, 那么必须创建对应的包体, 否则包体是可选的。 包体与包规范必
须同名且存放在同一个模式中。创建包体语法如下:


调用包

    通过 package_name.element 形式调用, 在包体中可以直接通过元素名调用。 但是, 在包体中定义而没有在包规范中声明的元素则是私有的, 只能在包体内部引用。


实例

-- 创建表数据
create table test(x int, y varchar(100));
insert into test values(1, 'One');
insert into test values(2, 'Two');
-- 创建包规范
create or replace package pkgrec as
    type rectype is record(a test.x%type, b test.y%type);
    rcvar rectype;
    function initvars return int;
	function getvars return int;
end;
/
-- 创建包体
create or replace package body pkgrec as
	function initvars return int as
	begin
		select x, y into rcvar from test where x = 2;
		return rcvar.a;
	end;
	function getvars return int as
	begin
		raise info 'rcvar.a = %, rcvar.b = %', rcvar.a, rcvar.b;
		return 0;
	end;
end;
/
-- 调用包
select pkgrec.initvars();
 initvars 
----------
        2
(1 row)
select pkgrec.getvars();
INFO:  rcvar_pr.a = 12, rcvar_pr.b = Two Ten
 getvars 
---------
       0
(1 row)


请使用浏览器的分享功能分享到微信等