声明游标未执行

时间:2017-12-12 20:50:44

标签: 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;

请指教,谢谢

1 个答案:

答案 0 :(得分:4)

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;

请注意,这是一个有效的(示例)程序。但是DeclareCursor子程序实际上从未被调用过!即使在WHERE子句中使用了主变量,也不需要这样做。

执行OPEN时使用主机变量的值。

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