您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

库成员

语法

代码语法使用库成员 ::= [] [] ::= {}... ::= USING AS ; ::= [.] ::= ::= [ . ] ':' ::= = { | | } ; | '[' ']' = { | } ; | = { | } ; ::= ( [ [ {, }...] ] ) ::= CALL ( ) ; | CALL ( ) ;

描述

访问模式

每个库成员都可以具有 PUBLIC 或 PRIVATE 访问模式。专用成员不能在库外访问,而 PUBLIC 成员可以在过程和函数中自由使用。

库成员变量

库成员变量的范围绑定到其会话。库变量的值在整个会话期间保持不变。如果变量由同一会话内的不同 语句访问,则这些语句将访问同一变量。但是,如果从不同的会话访问,则库成员变量可以显示不同的值。

库成员变量支持以下原始数据类型: 布尔值类型布尔数字类型TINYINT SMALLINT INT BIGINT DECIMAL SMALLDECIMAL REAL DOUBLE字符串类型VARCHAR NVARCHAR ALPHANUM日期时间类型TIMESTAMP SECONDDATE TIME

库成员函数和过程

库函数和过程可以声明为私有或公共。专用函数和过程供库内部使用。无法从库外部调用它们。具有 EXECUTE 权限的任何人都可以使用公共函数和过程。这些函数和过程可以像非库函数和过程一样使用和声明,但它们可以访问库私有变量、私有函数和私有过程。还可以从库外部调用过程和函数,也可以调用其他库。库函数的使用仅限于分配的右侧,无法在查询中使用。

解析非限定名称

库成员不是元数据对象,因此它可能与另一个过程或函数同名。解析库定义中的非限定名称时,系统首先检查在当前库成员之前定义的库成员。如果在库中未找到名称,则会在库模式中搜索名称。为了减少歧义性并避免重复的名称,建议对用户定义的函数使用完全限定名。

示例

示例代码设置create table data_table(col1 int); do begin declare idx int = 0; for idx in 1..200 do insert into data_table values (:idx); end for;end; 示例代码库 DDLcreate library mylib as begin public variable maxval constant int = 100; public function bound_with_maxval(i int) returns x int as begin x = case when :i > :maxval then :maxval else :i end; end; public procedure get_data(in size int, out result table(col1 int)) as begin result = select top :size col1 from data_table; end;end; 示例代码使用库的过程create procedure myproc (in inval int) as begin using mylib as mylib; declare var1 int = mylib:bound_with_maxval(:inval); if :var1 > mylib:maxval then select 'unexpected' from dummy; else declare tv table (col1 int); call mylib:get_data(:var1, tv); select count(*) from :tv; end if;end; 示例代码结果call myproc(10);Result: count(*)10 call myproc(150);Result:count(*)100