我已将一个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;
请指教,谢谢
答案 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语句。