RPGLE внедрено SQL 'выбрать из финальной таблицы ...', выбрасывая SQL0029 во время компиляции - PullRequest
1 голос
/ 08 марта 2020

То, что выглядит как простой оператор 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)                     
     ) ;                                            

Ответы [ 2 ]

3 голосов
/ 08 марта 2020

В предложении select отсутствует оператор into, который помещает результат в переменную 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)                     
     ) ;                                           
0 голосов
/ 01 апреля 2020

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

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, ...);
...