2016-05-16 3 views
1

Я не уверен, что не так с моим кодом, я пытаюсь сделать цикл while, который будет отображать следующие символы в поле (код) с помощью курсора, который объявлен в SQL. Цель состоит в том, чтобы получить следующие совпадающие символы с циклом. Затем я хочу вернуть результаты в конце цикла. Цель состоит в том, чтобы сделать частичное совпадение с кодом, если нет точного соответствия. Раньше я никогда не использовал курсоры, поэтому я старался как можно больше узнать об использовании fetch и курсоров.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; 

Предлагаю вам прочитать RPGLE раздел Справочник по встроенному SQL-программированию.

+0

Большое спасибо, это поможет мне понять это намного лучше! –

+1

еще одна вещь, предполагая, что 'CODE' и' FIELD' являются символьными полями длины длины, вам, вероятно, нужно ''% '|| trim (: code) || '%' '. – Charles

+1

Хотя, пожалуйста, откажитесь от символов варианта, символа _bar_ «|» и замените || как оператор, с оператором CONCAT as. – CRPence

Смежные вопросы