Встроенный SQL RPGLE «выбрать из финальной таблицы», выдающий SQL0029 во время компиляции

То, что выглядит как простой оператор SQL, выдает ошибку SQL0029... 'Позиция 14 предложения INTO отсутствует во встроенном операторе.'.
Первый очевидный момент заключается в том, что в моем операторе отсутствует не 'INTO', а предварительный запрос SQL. компилятор иногда выдает сообщения, которые не имеют прямого отношения к реальной причине.

Я разбил утверждение на самые простые шаги и построил его поэтапно. Все шаги, которые я предпринял, были скомпилированы в прекомпиляторе SQL. Только когда я вставляю «выбрать UFVAID из финальной таблицы...», возникает ошибка.

Программа определена как SQLRPGLE и содержит другие операторы SQL, против которых не возражают.

Значение, которое я хочу получить из вставки, представляет собой поле автоинкремента, которое будет использоваться в последующих вставках.

Любые подсказки были бы замечательными. Спасибо.

Заявление

Exec Sql                                                     
  select UFVAID from final table (                           
  insert into elglvat                                        
    (UFVASE, UFTNAL, UFTNNU, UFVINT, UFVDEC, UFVALS,         
     UFVALM, UFVDAT, UFVTIM, UFVTSP)                         
  values                                                     
    (:UFVASE, :UFTNAL, :UFTNNU, :UFVINT, :UFVDEC, :UFVALS,   
     :UFVALM, :UFVDAT, :UFVTIM, :UFVTSP)                     
     ) ;                                            

person Brenski    schedule 07.03.2020    source источник


Ответы (2)


Вам не хватает оператора into в предложении select, который помещает результат в переменную RPG. Это не следует путать с предложением вставки into.

Exec Sql                                                     
  select UFVAID 
    into :MyRpgVar // <===== Missing this line
  from final table (                           
  insert into elglvat                                        
    (UFVASE, UFTNAL, UFTNNU, UFVINT, UFVDEC, UFVALS,         
     UFVALM, UFVDAT, UFVTIM, UFVTSP)                         
  values                                                     
    (:UFVASE, :UFTNAL, :UFTNNU, :UFVINT, :UFVDEC, :UFVALS,   
     :UFVALM, :UFVDAT, :UFVTIM, :UFVTSP)                     
     ) ;                                           
person Player1st    schedule 08.03.2020

Player1st дает вам хороший способ получить значение из ссылки на таблицу изменений данных, но если вы вставляете только одну строку, вы можете получить последнее сгенерированное удостоверение с помощью IDENTITY_VAL_LOCAL().

So

Exec Sql                                                     
  insert into elglvat                                        
    (UFVASE, UFTNAL, UFTNNU, UFVINT, UFVDEC, UFVALS,         
     UFVALM, UFVDAT, UFVTIM, UFVTSP)                         
  values                                                     
    (:UFVASE, :UFTNAL, :UFTNNU, :UFVINT, :UFVDEC, :UFVALS,   
     :UFVALM, :UFVDAT, :UFVTIM, :UFVTSP);

затем

Exec sql
  insert into <a detail table>
    values(IDENTITY_VAL_LOCAL, FIELD1, FIELD2, ...);
person jmarkmurphy    schedule 01.04.2020