存储过程是一个已编译程序,存储在 DB2 局部或远程服务器上,可以执行 SQL 语句。 在 Net.Data 中是使用 CALL SQL 语句从 Net.Data 函数中来调用存储过程的。存储过程的参数传 送自 Net.Data 函数参数表。通过以数据库服务器保持编译的 SQL 语句,可使用存储过程来改进性能和完整性。
本节描述以下主题:
存储过程的语法使用 FUNCTION 语句、CALL 语句以及任选的 REPORT 块。
%function (dtw_sql) function_name ([IN datatype arg1, INOUT datatype arg2, OUT tablename...]) CALL stored_procedure [(resultsetname....)] [%REPORT(resultsetname...)]
其中:
BIGINT | FLOAT | SMALLINT |
CHAR | INTEGER | TIME |
DATE | GRAPHIC | TIMESTAMP |
DECIMAL | LONGVARCHAR | VARCHAR |
DOUBLE | LONGVARGRAPHIC | VARGRAPHIC |
DOUBLEPRECISION |
|
|
|
|
|
要调用一个存储过程:
%function (dtw_sql) function_name()
%function (dtw_sql) function_name (IN datatype arg1, INOUT datatype arg2, OUT tablename...)
CALL stored_procedure
%REPORT
例子:
%function (dtw_sql) mystoredproc (IN CHAR(30) arg1) { CALL myproc %report { ... %row { .... %} ... %} %}
CALL stored_procedure (resultsetname1, resultsetname2, ...)
%REPORT(resultsetname1)
例子:
%function (dtw_sql) mystoredproc (IN CHAR(30) arg1, OUT table1) { CALL myproc (table1, table2) %report (table2) { ... %row { .... %} ... %} %}
您可以将参数传送给一个存储过程,并可以让存储过程更新参数值,以使新值传送回 Net.Data 宏。通过用 IN 关键字指定参数名来将参数传送至存储过程中。如果存储过程将要更新参 数,则您必须用 INOUT 或 OUT 关键字来为返回值传送参数。为参数指定的数据类型必须匹配存储 过程期望的类型。
例子 1: 将参数值传送给存储过程
%function (dtw_sql) mystoredproc (IN CHAR(30) valuein) { CALL myproc ...
例子 2: 从存储过程返回一个值
%function (dtw_sql) mystoredproc (OUT VARCHAR(9) retvalue) { CALL myproc ...
存储过程中可能返回一个或多个结果。结果集可存储在 Net.Data 表格中,以备在宏中进一步处 理或使用 REPORT 块来显示。必须为存储过程所生成的每个结果集关联一个名称。这是通过在 CALL SQL 语句上指定参数来完成的。为结果集指定的名称就与一个 REPORT 块或 Net.Data 表格关联起 来,允许您确定 Net.Data 如何处理每个结果集。你可以:
如果一个存储过程生成多个结果集,就必须在 CALL SQL 语句上为每个结果集 指定一个参数。
要返回单个结果集并用一个缺省报表来显示它:
使用以下语法:
%function (dtw_sql) function_name () { CALL stored_procedure () %}
例如:
%function (dtw_sql) mystoredproc() { CALL myproc %}
要返回单个结果集并指定一个 REPORT 块以备显示处理:
使用以下语法:
%function (dtw_sql) function_name () { CALL stored_procedure %REPORT (resultsetname) { ... %} %}
例如:
%function (dtw_sql) mystoredproc () { CALL myproc %REPORT { ... %row { .... %} ... %} %}
同样可使用以下语法:
%function (dtw_sql) function_name () { CALL stored_procedure (resultsetname) %REPORT (resultsetname) { ... %} %}
例如:
%function (dtw_sql) mystoredproc () { CALL myproc (mytable1) %REPORT (mytable1) { ... %row { .... %} ... %} %}
要在 Net.Data 表格中存储一个结果集以备进一步的处理:
使用以下语法:
%function (dtw_sql) function_name (OUT tablename) { CALL stored_procedure (tablename) %}
例如:
%define DTW_DEFAULT_REPORT = "NO" %function (dtw_sql) mystoredproc (OUT mytable1) { CALL myproc (mytable1) %}
注意,DTW_DEFAULT_REPORT 设置为 NO,因此没有为结果集生成缺省报表。
要返回多个结果集并用缺省报表格式显示它们:
使用以下语法:
%function (dtw_sql) function_name () { CALL stored_procedure (tablename1, tablename2) %}
例如:
%function (dtw_sql) mystoredproc () { CALL myproc (mytable1, mytable2) %}
要返回多个结果集并在 Net.Data 表格中存储结果集以备进一步处 理:
使用以下语法:
%function (dtw_sql) function_name (OUT tablename1, tablename2) { CALL stored_procedure (resultsetname1, resultsetname2) %}
例如:
%define DTW_DEFAULT_REPORT = "NO" %function (dtw_sql) mystoredproc (OUT mytable1 mytable2) { CALL myproc (mytable1, mytable2) %}
注意,DTW_DEFAULT_REPORT 设置为 NO,因此没有为结果集生成缺省报表。
要返回多个结果集并指定 REPORT 块以备显示处理:
每个结果集都与它自己的 REPORT 块相关联的。使用以下语法:
%function (dtw_sql) function_name () { CALL stored_procedure (resultsetname1, resultsetname2) %REPORT (resultsetname1) ... %row { .... %} ... %} %REPORT (resultsetname2) ... %row { .... %} ... %} %}
例如:
%function (dtw_sql) mystoredproc () { CALL myproc (mytable1, mytable2) %REPORT(mytable1) ... %row { .... %} ... %} %REPORT(mytable2) ... %row { .... %} ... %} %}
要返回多个结果集并为每个结果集指定不同的显示或处理选项:
可以使用唯一的参数名为每个结果集指定不同的处理选项。例如:
%function (dtw_sql) mystoredproc (OUT mytable2) { CALL myproc (mytable1, mytable2, mytable3) %REPORT(mytable1) ... %row { .... %} ... %} %}
结果集 mytable1 由对应的 REPORT 块来处理,并如宏书写者所指定的那 样显示。结果集 mytable2 存储在 Net.Data 表格 mytable2 中,现在可 用于进一步的处理,例如传送给另一个函数。结果集 mytable3 是用 Net.Data 的缺省 报表格式显示的,因为没有为它指定 REPORT 块。
在一个存储过程中返回多个结果集时,请使用以下准则和限制。
准则:
限制: