【问题标题】:SQL FETCH, Cursors and RPGSQL FETCH、游标和 RPG
【发布时间】:2016-05-16 20:38:47
【问题描述】:

我不确定我的代码有什么问题,我正在尝试创建一个 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;

【问题讨论】:

    标签: sql cursor rpgle rpg sql-fetch


    【解决方案1】:

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

    1. 您试图将光标声明在错误的位置。
    2. %EOF() 与 RPG 记录级别访问一起使用,您需要检查 SQLCODE 或 SQLSTATE
    3. FETCHOPEN都是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 部分。

    【讨论】:

    • 非常感谢,这将帮助我更好地理解它!
    • 还有一件事,假设CODEFIELD 是固定长度的字符字段,您可能需要'%' || trim(:code) || '%'
    • 尽管请放弃变体字符,bar 符号“|”,并替换 ||作为运算符,以 CONCAT 作为运算符。
    • 结果集不太可能包含满足相等谓词的任何值的重复项?加上 UNION 在这里相当愚蠢。只需在两个谓词之间编写 OR 即可;根据对 N 行的隐含或实际 N 优化和表中的实际行数,可能只编码 LIKE 谓词 [if, with trim]。?最后,根据 field 数据,如果存在精确匹配和不精确匹配,请求的排序可能不会影响精确匹配优先;似乎从描述性[与实际输入和所需输出的表示相比]可能需要精确匹配优先。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2011-10-16
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多