Я не знаю, получили ли вы ответ на другом сайте, но другим он может понадобиться.
Курсоры существуют "ГЛОБАЛЬНО", НО только в том модуле, где они объявлены, вы 'Нет необходимости передавать его процедурам в этом модуле, объявленный вами курсор всегда доступен, пока он не будет закрыт или работа не закончится.
Вы можете сделать что-то подобное (только если вы в ЖЕ МОДУЛЕ):
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" и находятся в одном и том же модуле.Первый готовит, объявляет и открывает курсор, второй извлекает строку в RowMC.
Как вы можете видеть, DS, используемый для выборки, является BASED, также массив NULLindicator.
ВсеПараметр 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
Надеюсь, это кому-нибудь поможет.