IBM Books

OS/400 版的 Net.Data 管理與程式設計手冊

儲存程序

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

本段落說明下列主題:

儲存程序語法

儲存程序的語法使用 FUNCTION 陳述式、CALL 陳述式,以及可選用的 REPORT 區塊。

%function (dtw_sql) function_name ([IN datatype arg1, INOUT datatype arg2, 
    OUT tablename, ...])
  CALL stored_procedure 
[%REPORT(resultsetname...)]

其中:

function_name
指起始儲存程序呼叫的 Net.Data 函數的名稱

stored_procedure
儲存程序名稱

datatype
指 Net.Data 支援的其中一種資料庫資料類型,顯示在表 2 中。參數列示中指定的資料類型必須與儲存程序中的資料類型相配。 有關這些資料類型的說明,請參閱您的資料庫文件。

tablename
指將儲存結果集合的 Net.Data 表格的名稱 (僅在結果集合將儲存在 Net.Data 表格時才會使用)。 若設定的話,這個參數須符合 resultsetname 的關聯參數名稱。

resultsetname
指與透過報表區塊從儲存程序傳回的結果集合有關聯的名稱。 這個參數須符合 tablename 的關聯參數名稱,若設定的話。

表 2. 儲存程序的資料類型
CHAR FLOAT TIME
DATE GRAPHIC TIMESTAMP
DECIMAL INTEGER VARCHAR
DOUBLE REAL VARGRAPHIC
DOUBLEPRECISION SMALLINT






呼叫儲存程序

欲呼叫儲存程序時:

  1. 定義起始儲存程序呼叫的函數。
    %function (dtw_sql) function_name() 
    

  2. 可選擇是否要對儲存程序設定任何 IN、INOUT 或 OUT 參數, 包括從儲存程序傳回的任何結果集合的結果集合名稱。
    %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 巨集。您可以經由以 IN 參數設定參數, 將參數傳遞給儲存程序。如果儲存程序將更新參數,則您須以 INOUT 或 OUT 關鍵字, 傳遞回覆值的參數。針對參數設定的資料類型須符合儲存程序所期望的資料類型。

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

%function (dtw_sql) mystoredproc (IN CHAR(30) valuein)  {
     CALL  myproc 
...

範例:從儲存程序傳回值

%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  
 %REPORT (resultsetname) {
  ...
 %}
%}

例如:

%function (dtw_sql) mystoredproc (OUT mytable1) {
     CALL  myproc   
 %REPORT (mytable1) {
      ...
      %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 = "MULTIPLE"
%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {       
    CALL myproc  
%}

若要傳回多個結果集合並設定 REPORT 區塊來進行處理顯示:

每一個結果集合均會與它自己的 REPORT 區塊產生關聯。可使用下列語法:

%function (dtw_sql) function_name (OUT tablename1, tablename2) { 
   CALL stored_procedure 
 %REPORT (resultsetname1) 
   ...      
   %row {  ...   %}   
   ...   
 %}    
 %REPORT (resultsetname2)       
   ...      
   %row {  ...   %} 
   ...   
 %} 
%}

例如:

%function (dtw_sql) mystoredproc (OUT mytable1, mytable2) {  
   CALL myproc    
 
 %REPORT(mytable1) {     
  ...    
 %row {  ...   %}     
  ...  
 %}   
 
 %REPORT(mytable2) {     
  ...     
 %row {  ...   %}     
  ...  
 %} 
%}


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