存储过程是一个已编译的程序,存储在可以执行 SQL 语句的 DB2 中。在 Net.Data 中, 使用 CALL 语句从 Net.Data 函数调用存储过程。存储过程的参数传送自 Net.Data 函数参数表。通过以数据库 服务器保持编译过的 SQL 语句,可使用存储过程来改进性能和完整性。Net.Data 支持 DB2 通过 SQL 和 ODBC 语言环境使用存储过程。
本节描述以下主题:
存储过程的语法使用 FUNCTION 语句、CALL 语句以及任选的 REPORT 块。
%FUNCTION function_name ([IN datatype arg1, INOUT datatype arg2,
OUT tablename, ...]) {
CALL stored_procedure
[%REPORT [(resultsetname)] { %}]
...
[%REPORT [(resultsetname)] { %}]
[%MESSAGE %}]
%}
其中:
| CHAR | FLOAT | SMALLINT |
| DATE | GRAPHIC | TIME |
| DECIMAL | INTEGER | TIMESTAMP |
| DOUBLE | REAL | VARCHAR |
| DOUBLEPRECISION |
| VARGRAPHIC |
|
|
|
|
|
|
|
|
%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 OUT mytable) {
CALL myproc
%REPORT {
...
%ROW { ... %}
...
%}
%}
%FUNCTION (DTW_SQL) function_name (OUT tablename, ...)
%REPORT(resultsetname1) {
...
%}
例子:
%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) arg1, OUT table1, table2) {
CALL myproc
%REPORT(table1) {
...
%ROW { ... %}
...
%}
%REPORT(table1) {
...
%ROW { ... %}
...
%}
%}
您可以将参数传送给一个存储过程,并可以让存储过程更新参数值,以使新值传送回 Net.Data 宏。函数参数列表上的参数个数与类型必须与为存储过程定义的个数与类型相匹配。 例如,如果参数列表上为存储过程定义的一个参数是 INOUT,那么函数参数列表上相应的参数必须是 INOUT。如果 列表上为存储过程定义的参数类型是 CHAR(30),那么函数参数列表上相应的参数必须也是 CHAR(30)。
例子 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 块来处理。如果一个存储过程 生成多个结果集,就必须使存储过程生成的每个结果集与一个名称相关联。这是通过 在 FUNCTION 语句中指定参数来完成 的。为结果集指定的名称就与一个 REPORT 块或 Net.Data 表格关联起 来,允许您确定 Net.Data 如何处理每个结果集。您可以:
结果集通常存储在本地表格中,因此宏中的其它函数也可以访问其中的数据。例如,可以将一个 Net.Data 表格传送到另一个函数,以使它可使用数据进行计算并 根据这些计算来显示结果。
请参阅多个 REPORT 块的准则和限制,以获取使用多个报表块时的准则和限制。
要返回单个结果集并使用缺省报表:
使用以下语法:
%FUNCTION (DTW_SQL) function_name (OUT tablename) {
CALL stored_procedure
%}
例如:
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1) {
CALL myproc
%}
要返回单个结果集并指定一个 REPORT 块:
使用以下语法:
%FUNCTION (DTW_SQL) function_name (OUT tablename) {
CALL stored_procedure [(resultsetname)]
%REPORT [(resultsetname)] {
...
%}
%}
例如:
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1) {
CALL myproc
%REPORT {
...
%ROW { ... %}
...
%}
%}
同样可使用以下语法:
%FUNCTION (DTW_SQL) function_name () {
CALL stored_procedure
%REPORT () {
...
%}
%}
例如:
%FUNCTION (DTW_SQL) mystoredproc () {
CALL myproc
%REPORT {
...
%ROW { ... %}
...
%}
%}
要返回多个结果集并用缺省报表格式显示它们:
使用以下语法:
%FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2) {
CALL stored_procedure
%}
其中不指定报表块。
例如:
%DEFINE DTW_DEFAULT_REPORT = "YES"
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%}
要返回多个结果集并指定 REPORT 块以备显示处理:
每个结果集都与一个或多个 REPORT 块相关联的。使用以下语法:
%FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2, ...) {
CALL stored_procedure
%REPORT (tablename1)
...
%ROW { ... %}
...
%}
%REPORT (tablename2)
...
%ROW { ... %}
...
%}
...
%}
例如:
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {
CALL myproc
%REPORT (mytable1) {
...
%ROW { ... %}
...
%}
%REPORT(mytable2) {
...
%ROW { ... %}
...
%}
%}