Выполнение оператора SQL с использованием переменной RPG в качестве имени курсора

Я хочу передать курсор и структуру данных в процедуру, затем процедура заполняет структуру следующей строкой из курсора 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

Как мне передать курсор и как определить параметр структуры данных?


person jax    schedule 15.06.2011    source источник


Ответы (2)


Я не знаю, получили ли вы ответ на другом сайте, но он может понадобиться другим.

Курсоры существуют «ГЛОБАЛЬНО», НО только в модуле, где они объявлены, вам не нужно передавать его процедурам в этом модуле, объявленный вами курсор всегда доступен, пока он не будет закрыт или задание не завершится.

Вы можете сделать что-то вроде этого (только если вы находитесь в ТОМ ЖЕ МОДУЛЕ):

 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 

Эти две процедуры используют один и тот же курсор "mC" и находятся в одном модуле. Первый подготавливает, объявляет и открывает курсор, второй извлекает строку в RowMC.

Как вы можете видеть, DS, используемый для выборки, является BASED, массив индикаторов NULL тоже.

Все параметры Like и LikeDS определены в файле копии как ШАБЛОН, например:

 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 

Надеюсь, это может помочь кому-то.

person M4mu5    schedule 22.12.2011
comment
Просто хочу быстро указать на ошибку в этом ответе. DS, используемый для выборки (Rowmc), не является базовым. Rowmc_b базируется и лежит непосредственно поверх Rowmc. Использование «На основе» было пред-шаблонной техникой для определения того, что по сути является шаблоном, если вы никогда не основываете его ни на чем. В вашем примере Rowmc_b и pNull1 не нужны. Те же комментарии относятся к массиву нулевого индикатора (NullImc) и структуре вокруг него. - person jmarkmurphy; 30.10.2015
comment
спасибо @jmarkmurphy, как вы можете видеть ответ 2011 года, под мостом утекло много воды!!! Спасибо, что указали на это, вы действительно правы. На данный момент у меня нет возможности протестировать новый обновленный ответ, опубликованный здесь все еще работает, но он немного избыточен, надеюсь, у меня будет возможность написать и протестировать новый. Большое спасибо. Поскольку ответ BASED - это просто недоразумение, я имею в виду, что переменная, на которую ссылается выборка, является BASED/template (основанный - это один из способов определения ШАБЛОНА до версии 6.1). Правильно для 'Rowmc_b' и 'pNull1', вероятно, копирование и вставка старых переменных. - person M4mu5; 23.11.2015

Я не уверен, что вы можете динамически определить курсор. Лучше всего задать этот вопрос на RPG400-L. В этом списке есть члены команды компиляторов RPG, которые часто отвечают на подобные вопросы.

person Mike Wills    schedule 15.06.2011
comment
Спасибо, я зарегистрировался у них - person jax; 16.06.2011