2015-12-21 64 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);