2015-12-21 68 views
0

我遇到問題,返回錯誤返回我的查詢。我有在這一刻是這樣的:SQLRPGLE DB2選擇變量

comi   C     X'7D' 
SqlQuery  S   500A   
VarSel   S    10A 

VarSel = *blanks;           
SqlQuery = 'select USU into VarSel from FXXUSELN ' +  
      'where USU = upper(' + comi + %trim(pusuario) + 
      comi + ') and PWDUSU = upper(' + comi +   
      %trim(ppassword) + comi + ')';     
Exec SQL execute immediate :SqlQuery;      

psqlcod = sqlcod; 

但是,當我嘗試調試代碼,它返回-084:不能接受SQL語句作爲SQLCOD。在調試器中調用我得到這個字符串,這似乎是正確的打印SqlQuery類變量:

select USU into VarSel from FXXUSELN where USU = upper('usua 
rio') and PWDUSU = upper('password')  

任何人知道如何解決這個問題,所以我可以做一個登錄的存儲過程?提前致謝。

回答

2

問題是SELECT INTO無法動態準備。

如果你看一下在manualSELECT INTO調用節中,你會看到:

此語句只能嵌入到應用程序。這是一個不能動態準備的可執行語句。它不能在REXX中指定。

還要注意以下Actions Allowed on SQL Statements手冊中的附錄B部分,其中總結了每個語句的使用位置/方式。

最後,如果你試過的東西已經工作了,你最多可以打開SQL注入攻擊。一般來說,對於任何數據庫,您應該避免使用動態SQL。如果您必須使用動態SQL,那麼您應該使用參數製作者而不是直接將用戶輸入串聯到字符串中。

就你而言,如果第一個地方不需要動態SQL。靜態SQL更簡單,更安全,並允許使用SELECT INTO

exec SQL 
    select USU into :VarSel from FXXUSELN  
    where USU = upper(:pusuario) 
      and PWDUSU = upper(:ppassword);