SQLRPGLE DB2 Select into变量

SQLRPGLE DB2 Select into变量,select,db2,Select,Db2,我的查询返回错误时遇到问题。此刻我所拥有的是: comi C X'7D' SqlQuery S 500A VarSel S 10A VarSel = *blanks; SqlQuery = 'select USU into VarSel from FXXUSEL

我的查询返回错误时遇到问题。此刻我所拥有的是:

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')       

有人知道如何解决这个问题,这样我就可以建立一个登录存储过程了吗?提前感谢。

问题是无法动态准备“选择进入”

如果查看中的
选择进入
调用部分,您将看到:

此语句只能嵌入到应用程序中。它是一个无法动态准备的可执行语句。不得在REXX中指定

另请注意手册附录B的以下章节,该章节总结了每种陈述的使用位置/方式

最后,如果您尝试的方法成功了,那么您将面临SQL注入攻击。一般来说,对于任何数据库,都应该避免使用动态SQL。如果必须使用动态SQL,那么应该使用参数生成器,而不是直接将用户输入连接到字符串中

在您的情况下,如果首先需要动态SQL,那么就不需要动态SQL。静态SQL更容易、更安全,并且允许使用
SELECT-INTO

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