2016-05-16 48 views
1

我不確定我的代碼出了什麼問題,我正在嘗試創建一個while循環,它將使用在SQL中聲明的遊標來獲取字段(代碼)中的下一個字符。目標是通過循環獲取下一個匹配的字符。然後我想在循環結束時返回結果。目標是與代碼進行部分匹配,如果沒有完全匹配的話。我之前從未使用過遊標,所以我儘可能多地學習使用獲取和遊標。SQL FETCH,Cursors和RPG

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; 

回答

5

哇......很多錯在這裏... 快速瀏覽......

  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部分的參考。

+0

非常感謝,這會幫助我更好地理解它! –

+1

還有一件事,假設'CODE'和'FIELD'是一個固定長度的字符字段,你可能需要''%'||修剪(:代碼)|| '%''。 – Charles

+1

雖然請放棄變形字符,但_bar_符號「|」,並替換||。作爲運營商,以CONCAT作爲運營商。 – CRPence