来自不同长度变量的 Exec sql 的 SQLRPGLE 语法?

SQLRPGLE syntax for Exec sql from a varying length variable?

在 IBMi 上(数据库是 DB2 for i)在 SQLRPGLE 中,我有一个程序可以将大型 SQL 语句构建到我想要 运行 的变量中。

当我尝试运行它作为一个变量时,我收到一个令牌错误

一些背景

这是一个有效的示例,因为它不使用变量

Exec SQL                                                                
Create table MyLib/MyFile as(select * from XXLIB/XXFILE)   
DATA INITIALLY DEFERRED REFRESH DEFERRED                       
maintained by user;                                           

当我将其保存在@SQLStm 之类的变量中,然后尝试以 SQL

的形式执行时
Exec SQL                  
   :@SQLStm; 

我收到错误 令牌:无效。有效标记: .

我也愿意接受不同的方法 https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/cl/runsqlstm.htm 像 运行SQLSTM SRCFILE(MYLIB/MYFILE) SRCMBR(MYMBR)

也许有办法获取变量并将其保存到源成员? 然后在源成员

上使用运行SQLSTM

显示一些代码: 变量的定义

d @SQLStm         s               A   Len(6144) Varying(4)      

即使尝试将 SQL 语句的一部分作为变量

@SQLStm = select * from XXLIB/XXFILE;

然后尝试:

Exec SQL     
  Create table MyLib/MyFile as( :@SQLStm)    
  DATA INITIALLY DEFERRED REFRESH DEFERRED                       
  maintained by user;

我收到错误 令牌:无效。有效标记: .

我希望 SQLRPLE 能够编译 而不是 SQL 预编译失败。

消息 ID SEV 记录文本
SQL0104 30 236 位置 31 令牌:无效。有效令牌:
.

消息摘要
总信息警告错误严重终端
1 0 0 0 1 0
在源

中发现 30 级严重性错误

这是静态的SQL

Exec SQL                                                                
Create table MyLib/MyFile as(select * from XXLIB/XXFILE)   
DATA INITIALLY DEFERRED REFRESH DEFERRED                       
maintained by user; 

你要的是动态的SQL

wSqlStmt = 'Create table MyLib/MyFile as(select * from XXLIB/XXFILE)'
            + ' DATA INITIALLY DEFERRED REFRESH DEFERRED'
            + ' maintained by user'; 
exec SQL
  execute immediate :wSqlStmt;

请注意,某些语句不能 execute immediate,您必须 prepare 然后 execute 它们。

可以在 Embedded SQL programming 手册中找到更多信息。