【问题标题】:SQLRPGLE syntax for Exec sql from a varying length variable?来自不同长度变量的 Exec sql 的 SQLRPGLE 语法?
【发布时间】:2019-07-26 18:38:31
【问题描述】:

在 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 像 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 记录文本
SQL0104 30 236 位置 31 令牌:无效。有效令牌:
.

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

【问题讨论】:

    标签: sql db2-400 rpgle


    【解决方案1】:

    这是静态 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手册中找到。

    【讨论】:

    • 谢谢!你会如何用prepare做同样的事情?
    • 没关系我找到了语法Exec SQL PREPARE S1 FROM :@SQLStm; Exec SQL EXECUTE S1;
    • @VAIJason 正确...请注意,虽然 每个 示例显示的名称如 S1、C1 等...您应该使用长 唯一 名称.否则,您将在生产中遇到冲突……当您有使用 SQL 的程序调用其他使用 SQL 的程序时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多