到目前为止,只能在其他 SQLScript 对象(如过程、函数或匿名块)范围内使用用户定义库 (UDL) 的库成员。例如,即使您只想运行单个库成员过程,也必须在匿名块中创建过程或执行成员过程。当没有参数时,将成员访问包装到匿名块中是简单的,但如果有输入和输出参数,它可能会变得更加复杂。现在,您可以直接调用库成员过程,而无需使用其他 SQLScript 对象。
代码语法IN DEBUG MODE] | CALL
旧行为新行为create library mylib as begin public procedure memberproc(in i int, out tv table(col1 nvarchar(10))) as begin tv = select :i * 100 as col1 from dummy; end;end; do (in iv int => 1, out otv table(col1 nvarchar(10)) => ?) begin using mylib as mylib; call mylib:memberproc(:iv, otv);end;create library mylib as begin public procedure memberproc(in i int, out tv table(col1 nvarchar(10))) as begin tv = select :i * 100 as col1 from dummy; end;end; call mylib:memberproc(1, ?);
库成员可由库名称和库成员名称引用。如果库别名由 USING 语句设置,则可以使用别名代替库名称。
如果指定了别名,SQLScript 会首先尝试将未限定的库名称解析为库别名。如果在库别名列表中未找到名称,则 SQLScript 将使用缺省模式解析名称。但是,如果指定了模式名称,则始终在模式内搜索库,并忽略任何现有别名。
示例代码示例库create schema myschema1;create schema myschema2; create library myschema1.mylib as begin public procedure memberproc (out ov varchar(10)) as begin ov = 'myschema1'; end;end; create library myschema2.mylib as begin public procedure memberproc (out ov varchar(10)) as begin ov = 'myschema2'; end;end; 示例代码示例 1create or replace procedure myproc1 (out ov varchar(10))default schema myschema2as begin using myschema1.mylib as mylib; call mylib:memberproc(ov);end; call myproc1(?); -- result: 'myschema1' 在此示例中,CALL 语句中的库名不是完全限定的,并且存在同名的别名。在这种情况下, mylib 解析为库 mylib ,它引用 myschema1.mylib 。 示例代码示例 2create or replace procedure myproc2 (out ov varchar(10))default schema myschema2as begin call mylib:memberproc(ov);end; call myproc2(?); -- result: 'myschema2' 在此示例中,CALL 语句中的库名不是完全限定的,并且没有同名的别名。在这种情况下, mylib 仅在默认模式中找到,并引用 myschema2.mylib 。 示例代码示例 3create or replace procedure myproc3 (out ov varchar(10))as begin using myschema1.mylib as mylib; call myschema2.mylib:memberproc(ov); -- Resolved as myschema2 because the schema is explicitly described.end; call myproc3(?); -- result: 'myschema2' 在此示例中,CALL 语句中的库名称为 mylib ,并且存在具有相同名称的别名。但是,库名使用模式名称 myschema2 完全限定,并解析为 myschema2.mylib 。
以下限制适用: