1

カーソルとデータ構造をプロシージャに渡したいのですが、プロシージャはSQLカーソルから次の行を構造に取り込みます。これは可能ですか?私が達成しようとしているもののテンプレートを以下に示します。

  *****************************************************
  *
  * Fetch the next row from a cursor
  *
  * @param cursor - the name of the cursor
  * @param structure - the data structure to hold the fields
  *****************************************************
 pfetchNextRow     B
 DfetchNextRow     PI              N
 d cursor                     32767A   varying const
 d structure       DS                  ???????               
  /free 
     exec sql
       fetch next from :cursor  into :structure 
     ;

     if (sqlstate = SQL_SUCCESS);
       return *on;
     else;
       exec sql
         close :cursor;
       return *off;
     endif;

  /end-free
 pfetchNextRow     E

どのようにカーソルを渡す必要がありますか?また、データ構造パラメーターをどのように定義しますか?

4

2 に答える 2

1

あなたが他のサイトで回答を受け取ったかどうかはわかりませんが、他の人がそれを必要とする可能性があります.

カーソルは「グローバル」に存在しますが、宣言されているモジュールにのみ存在します。このモジュールのプロシージャに渡す必要はありません。宣言したカーソルは、閉じられるかジョブが終了するまで常に使用できます。

次のようなことができます (同じモジュールにいる場合のみ):

 P SQLprep_mC      B                   EXPORT
 D SQLprep_mc      PI                  Like(g_retCode)
 D strInSQL                            Like(string_MAX_V)

  /Free
   exec SQL
     SET OPTION
         CLOSQLCSR = *ENDACTGRP;
   exec sql prepare p1 from :strINsql ;
   //.... declare and open
  /End-Free

 P SQLprep_mC      E  



 P SQLfetch_mC_st  B                   EXPORT
 D SQLfetch_mC_st  PI                  Like(g_retCode)
 D    Row                              LikeDs(dsSql_0)
 D    NullI                            Like(sqlNI_0) Dim(DSSql0_nFields)

 D Rowmc_b         DS                  LikeDs(dsSql_0) Based(pNull1)
 D Rowmc           DS                  LikeDs(dsSql_0)
 D pNUll1          s               *   inz(%ADDR(Rowmc))
 D SQLind          s                   Like(sqlNI_0) Based(pNull2)
 D NullImc         S                   like(SQLind) Dim(DSSql_nFields)
 D pNull2          s               *   inz(%ADDR(NullImc))

  /free
     exec SQL fetch next from mC into :Rowmc :NullImc ;
     Row   = Rowmc   ;
     NullI = NullImc ; 
  /end-free

 P SQLfetch_mC_st  E 

これら 2 つのプロシージャは、同じカーソル "mC" を使用し、同じモジュール内にあります。最初にカーソルを準備、宣言、および開き、2 番目に RowMC で行をフェッチします。

ご覧のとおり、フェッチに使用される DS は BASED であり、NULLindicator 配列も同様です。

Like および LikeDS パラメータはすべて、次のようにコピー ファイルで TEMPLATE として定義されます。

 D comfraf       e DS                  extname(comfra00f) QUALIFIED TEMPLATE
 D dsSql_0         DS                  Qualified  TEMPLATE
 D  cid                                like(comfraf.cid      )            
 D  ccap                               like(comfraf.ccap     )            

 D sqlNI_0         s              5I 0 TEMPLATE 

これが誰かを助けることを願っています。

于 2011-12-22T11:35:21.967 に答える
0

カーソルを動的に定義できるかどうかはわかりません。この質問をするのに最適な場所は、RPG400-Lです。そのリストには、このような質問によく答える RPG コンパイラ チームのメンバーがいます。

于 2011-06-15T13:25:48.653 に答える