2015-04-02 89 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