IBM Books

Net.Data 管理与程序设计指南,OS/2、Windows NT 以及 UNIX 版

调用存储过程

存储过程是一个已编译程序,存储在 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...)]

其中:

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

stored_procedure
是存储过程的名称

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

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

resultsetname
一个名称,它将返回自存储过程的结果集与报表块相关联。如果指定的话,此参数名称必须匹配 tablename 的关联的参数名称。

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




调用存储过程

要调用一个存储过程:

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

  2. 任选地为存储过程指定任何 IN、INOUT 或 OUT 参数。包含一个表格名称以在 Net.Data 表格中存储结果集(如果您希望结果集存储在 Net.Data 表格中,只需要指定一个 Net.Data 表格)。
    %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)  {
         CALL myproc   
    %report {
      ...
      %row {  ....   %}
      ...   
     %} 
    %}
    

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

传送参数

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

返回多个结果集的准则和限制

在一个存储过程中返回多个结果集时,请使用以下准则和限制。

准则:

限制:


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