IBM Books

OS/400 版管理及程式設計指南

儲存程序

儲存程序是一種已編譯的程式,儲存於 DB2 中, 可執行 SQL 陳述式。在 Net.Data 中,儲存程序是從 Net.Data 函數上使用 CALL 陳述式來呼叫。 儲存程序參數是從 Net.Data 函數參數列示中來傳入。您可以使用儲存程序, 經由保存編譯過的 SQL 陳述式和資料庫伺服器,來改善執行效能和提升完整性。 Net.Data 支援透過 SQL 與 ODBC 語言環境,以 DB2 使用儲存程序。

本段落說明下列主題:

儲存程序語法

儲存程序的語法使用 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)。

範例:傳送參數值至儲存程序

%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) valuein)  {
     CALL  myproc 

範例:從儲存程序傳回值

%FUNCTION (DTW_SQL) mystoredproc (OUT VARCHAR(9) retvalue)  {
     CALL  myproc  

處理結果集合

您可以使用 SQL 或 ODBC 語言環境,從儲存程序。 結果集合可以儲存在 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 {  ...   %}     
  ...  
 %} 
%}


[ 頁面頂端 | 前一頁 | 下一頁 | 目錄 | 索引 ]