首页 > 解决方案 > 来自不同长度变量的 Exec sql 的 SQLRPGLE 语法?

问题描述

在 SQLRPGLE 中的 IBMi(数据库是 DB2 for i)上,我有一个程序可以将大型 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 Like RUNSQLSTM SRCFILE(MYLIB/MYFILE) SRCMBR(MYMBR)

也许有一种方法可以获取变量并将其保存到源成员?然后在源成员上使用 RUNSQLSTM

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

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 预编译失败。

MSG ID SEV RECORD TEXT
SQL0104 30 236 位置 31 令牌:无效。有效令牌:
.

消息摘要
总信息警告错误严重终端
1 0 0 0 1 0
30 级严重错误在源中发现

标签: sqldb2-400rpgle

解决方案


这是静态 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 代替您必须使用它们。prepareexecute

更多信息可以在嵌入式 SQL 编程手册中找到。


推荐阅读