2

我不确定我的代码有什么问题,我正在尝试创建一个 while 循环,该循环将使用 SQL 中声明的游标获取字段(代码)中的下一个字符。目标是通过循环获得下一个匹配的字符。然后我想在循环结束时返回结果。如果没有完全匹配,目标是对代码进行部分匹配。我以前从未使用过游标,因此我尝试尽可能多地学习有关使用 fetch 和游标的知识。

EXEC SQL
SELECT field FROM file
WHERE  field = :code

UNION

DECLARE UserInput CURSOR FOR
SELECT field FROM file
WHERE  field LIKE '%' || :code || '%'
ORDER BY field ASC

OPEN UserInput
FETCH NEXT FROM UserInput
BEGIN
   DO WHILE <> %EOF 
         FETCH NEXT FROM UserInput
END
CLOSE UserInput
DEALLOCATE UserInput;
4

1 回答 1

9

哇...这里有很多错误...一目了然...

  1. 你试图在错误的地方声明你的光标。
  2. %EOF()使用 RPG 记录级别访问,您需要检查 SQLCODE 或 SQLSTATE
  3. FETCH OPEN都是 SQL 语句,需要在一个EXEC SQL
  4. DEALLOCATE不需要
  5. 需要FETCH将光标所在行变成一个RPG变量

看看这段代码:

EXEC SQL                                            
  DECLARE UserInput CURSOR FOR                      
    SELECT field FROM file                          
    WHERE  field = :code                            
    UNION                                           
    SELECT field FROM file                          
    WHERE  field LIKE '%' || :code || '%'           
    ORDER BY field ASC;                             
EXEC SQL                                            
  OPEN UserInput;                                   
--really should check SQLSTATE here too!            

EXEC SQL                                            
  FETCH NEXT FROM UserInput INTO :MyRpgVar;         

Dow SQLSTATE = '00000';                              
   --note 00000 = no errors or warning              
   --     02000 = no data                           
   <do somthing?>                                   
   EXEC SQL                                         
      FETCH NEXT FROM UserInput INTO :MyRpgVar;     
ENDDO;                                              

EXEC SQL                                            
  CLOSE UserInput; 

我建议您阅读嵌入式 SQL 编程参考的RPGLE部分。

于 2016-05-16T21:13:07.760 回答