sql - 来自不同长度变量的 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 级严重错误在源中发现
解决方案
这是静态 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
更多信息可以在嵌入式 SQL 编程手册中找到。
推荐阅读
- ruby - rbenv 在 tmux 中没有得到正确的版本
- c++ - 将 String 转换为 Epoch 一遍又一遍地返回常量值
- python - 为什么主窗体中的创建按钮不起作用?
- python - Django 模型 - 一对多或多对多
- node.js - 如何同时使用后端和前端的文件?
- activemq - 使用 amqp 协议模拟 Apache ActiveMq
- java - 无法部署 java firebase 功能 - 我做错了什么?
- angular - 如何在 Angular 9 中获得没有第三方 api 的私有 ip
- sql - oracle apex sql 的简单触发器/过程问题
- ios - 运行flutter项目外部存储时VS代码无法删除Runner.app