2015-04-02 87 views
1

我希望得到这个SQL语句的一些帮助。将变量传递给CLLE程序中的SQL语句

RUNSQL_X SQL('UPDATE mylib/myfile SET N53DSC = ''' *CAT &TEXT *CAT ''' where ''' *CAT + &N53GIDCHAR *CAT ''' = ''' *CAT &CHARID# *CAT ''')') COMMIT(*NONE) 

当我运行此我CLLE程序中,我得到以下信息:

令牌)无效。有效令牌:或使用SKIP等待。

任何帮助将不胜感激。

回答

1

首先......小心使用这样的动态语句,因为它们可以打开SQL注入攻击的可能性。在RPGLE中使用静态SQL语句会更安全。

但是如果你必须使用CLLE ...尝试以下操作:

dcl &quote type(*CHAR) len(1) value ('''') 
dcl &stmt type(*char) len(512) 

chgvar var(&stmt) value('UPDATE mylib/myfile set n53dsc = ' + 
       *CAT &quote *CAT &TEXT *CAT &quote + 
       *CAT 'where ' *CAT &N53GIDCHAR *CAT '=' + 
       *CAT &quote *CAT &CHARID# *CAT &quote) 
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# 
+0

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

+0

立即尝试。我在* CAT和TEXT后错过了一个引用。此外,将其更改为使用&STMT变量来保存整个SQL语句。最后,添加了DMPCLPGM,以便您能够看到整个声明。更容易弄清楚什么是错的。 – Charles 2015-04-02 16:52:59