RPGLE 嵌入 SQL 'select from final table...' 在编译时抛出 SQL0029

RPGLE embedded SQL 'select from final table...' throwing SQL0029 at compile time

看似简单的 SQL 语句正在抛出错误 SQL0029... 'Position 14 INTO clause missing from embedded statement.'.
第一个明显的一点是 'INTO' 在我的陈述中并没有遗漏,但是 SQL 预编译器有时会提供与真正原因没有直接关系的消息。

我已将声明分解为最简单的步骤,并分阶段进行构建。我采取的所有步骤都已在 SQL 预编译器中编译。只有当我插入 'select UFVAID from final table...' 时它才会抛出错误。

该程序被定义为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)                     
     ) ;                                            

您在 select 子句中缺少将结果放入 RPG 变量的 into 语句。这不要与插入子句 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)                     
     ) ;                                           

Player1st 为您提供了一种从数据更改 table 引用中检索值的好方法,但如果您只插入一行,则可以使用 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, ...);