IBM Books

管理与程序设计指南,OS/400 版

存储过程

存储过程是一个已编译的程序,存储在可以执行 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 %}]
 
%}

其中:

function_name
是 Net.Data 函数的名称,它初启存储过程的调用。

stored_procedure
是存储过程的名称

datatype
是 Net.Data 支持的数据库数据类型,正如表 6中所显示的那样。参数表中指定的数据类型必须匹配 存储过程中的数据类型。请参阅数据库文档以获取关于这些数据类型的更多信息。

tablename
是 Net.Data 表格的名称,结果集存储在表格中(仅当要在 Net.Data 表格中存储结果集 时才使用)。如果指定的话,此参数名称必须匹配 resultsetname 关联的参数名称。

resultsetname
是一个名称,它将返回自存储过程的结果与函数参数列表上的 REPORT 块和一个表格名称 (或这两者)相关联。REPORT 块上 的 resultsetname 必须与函数参数列表上 的 tablename相匹配。

表 6. 存储过程的数据类型
CHAR FLOAT SMALLINT
DATE GRAPHIC TIME
DECIMAL INTEGER TIMESTAMP
DOUBLE REAL VARCHAR
DOUBLEPRECISION
VARGRAPHIC






调用存储过程

  1. 定义一个函数,让它初启对存储过程的调用。
    %FUNCTION (DTW_SQL) function_name() 
    

  2. 任选地,为存储过程指定任何 IN、INOUT 或 OUT 参数, 包括从存储过程返回的任何结果集的结果集名称。还可以从另一个存储过程将其指定为表格名称或结果集,指定为 IN 或 INOUT 参数。
    %FUNCTION (DTW_SQL) function_name (IN datatype
    arg1, INOUT datatype arg2, 
        OUT tablename...) 
    

  3. 使用 CALL 语句来标识存储过程名称。
     CALL stored_procedure
    

  4. 如果存储过程将要生成一个结果集,则任选地指定一个 REPORT 块来定义 Net.Data 如何 显示结果集。
    %REPORT  {
    ...
    %}
    

    例子:

    %FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) arg1 OUT mytable)  {
        CALL myproc   
     %REPORT {
      ...
     %ROW {  ...   %}
      ...   
     %} 
    %}
    

  5. 如果存储过程将要生成多个结果集:

传送参数

您可以将参数传送给一个存储过程,并可以让存储过程更新参数值,以使新值传送回 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 {  ...   %}     
  ...  
 %} 
%}


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]