声明游标未执行

MAS*_*400 1 rpgle

我已经将一个 RPGLE 程序转换为 SQLRPGLE,我这样做了很多次。这次我遇到了奇怪的问题。(1) 程序一执行,SQLCODE就设置为077952576,不知道为什么。(2) 当我在调试中运行时,声明游标语句没有被执行,但其他以下 sql 语句被命中。

  Exec Sql                                                   
     DECLARE My_cursor CURSOR for                           
     select * FROM File1    where FLAG <> 'Y' 
     Order by Field1, Field2, Field3, Field4, Field5;
Run Code Online (Sandbox Code Playgroud)

请指教,谢谢

Cha*_*les 5

DECLARE CURSOR不是可执行语句。这是一个编译时语句。

你不应该在它之后检查 SQLCODE/SQLSTATE...

看看这个程序...

**FREE
ctl-opt main(mymain);
ctl-opt option(*srcstmt);
ctl-opt datfmt(*ISO) timfmt(*ISO);
ctl-opt cvtopt(*NODATETIME);

dcl-proc MyMain;
  dcl-s company char(3);
  dcl-s part    char(25);
  dcl-s desc    char(30);
  dcl-s msg     char(50);
  dcl-s selComp char(3);
  dcl-s myTimestamp timestamp;

  exec sql
    set option
       datfmt=*ISO, timfmt=*ISO;

  selComp = 'A06';
  exsr OpenCursor;
  exsr FetchData;
  exec SQL close C1;

  selComp = 'A15';
  exsr OpenCursor;
  exsr FetchData;
  exec SQL close C1;

  *INLR = *ON;
  return;

  begsr DeclareCursor;
     exec SQL
       declare C1 cursor for
          select pmco#, pmpart, pmdesc
           from pdpmast
           where pmco# = :selComp;
  endsr;

  begsr OpenCursor;
    exec SQL open C1;
  endsr;

  begsr FetchData;
    exec sql fetch next from C1 into :company, :part, :desc;
    msg = company + ':' + part + ':' + desc;
    dsply msg;
  endsr;
end-proc;
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个工作(示例)程序。但 DeclareCursor 子例程实际上从未被调用!即使子句中使用了主变量,也不需要如此WHERE

执行时使用主变量的值OPEN

另请注意,在嵌入式 SQL 中(如上所示)SET OPTION是编译时语句。事实上,整个源成员中只能有一条SET OPTION语句,并且它必须是预编译器看到的第一个 SQL 语句。