首先......小心使用这样的动态语句,因为它们可以打开SQL注入攻击的可能性。在RPGLE中使用静态SQL语句会更安全。
但是如果你必须使用CLLE ...尝试以下操作:
dcl "e type(*CHAR) len(1) value ('''')
dcl &stmt type(*char) len(512)
chgvar var(&stmt) value('UPDATE mylib/myfile set n53dsc = ' +
*CAT "e *CAT &TEXT *CAT "e +
*CAT 'where ' *CAT &N53GIDCHAR *CAT '=' +
*CAT "e *CAT &CHARID# *CAT "e)
dmpclpgm
runsql_x SQL(&stmt) COMMIT(*NONE)
编辑基于您的评论
。我愿意指出,一次读取一条记录并更新(使用SQL)是SQL的一个糟糕用法。
SQL是专为&设定的时间操作进行了优化...
我认为下面将完成你正在尝试做的。(不知道到底哪些领域是其表中)
update mylib/myfile
set n53dsc = <TEXT>
where n53gidchar in (select n53gidchar from mylib/otherfile)
and n53gidchar = charid#
Almost @Charles。程序所做的是打开两个文件,读取一个文件,如果N53GIDCHAR中的值为= CHARID#中的值,则更新N53DSC字段。现在正在返回的是... 2600 - RUNSQL_X SQL('UPDATE misbxg/nw0153F set n53dsc =''这个改变了''1494''=''1494''')COMMIT(* NONE) 令牌1494无效。有效令牌:使用SKIP在哪里等待。 也许它增加了一个太多的引号? – bggas400 2015-04-02 16:44:16
立即尝试。我在* CAT和TEXT后错过了一个引用。此外,将其更改为使用&STMT变量来保存整个SQL语句。最后,添加了DMPCLPGM,以便您能够看到整个声明。更容易弄清楚什么是错的。 – Charles 2015-04-02 16:52:59