如何在选择查询中分配字符串变量

Posted

技术标签:

【中文标题】如何在选择查询中分配字符串变量【英文标题】:how to assign the string variable in select query 【发布时间】:2018-04-02 12:28:14 【问题描述】:

ho 在 SQL Select 查询中添加字符串变量。 “tw.local.subBarCode”是字符串变量,“tw.local.caseID”也是字符串变量。

示例:在变量中有一些值

CASE_ID=15232 和 SUBBARCODE=ODDV-1803-015232-HL01。

tw.local.sql="select CS.ORIGINALCHECK_ID AS checkId, "+
"CS.CHECKTYPE_ID AS checkTypeId, "+
"CS.CHECKTYPE_ID AS componentID, "+
"CT.NAME AS componentName "+
"from CHECK_SUMMARY CS INNER JOIN CHECKTYPE CT "+
"ON CT.ID=CS.CHECKTYPE_ID "+
"where CS.ORIGINALCHECK_ID="+tw.local.subBarCode+" and CS.CASE_ID="+tw.local.caseID+"";

当我调试它在我的选择查询中获取变量时,如下所示。

select CS.ORIGINALCHECK_ID AS checkId, 
CS.CHECKTYPE_ID AS checkTypeId, 
CS.CHECKTYPE_ID AS componentID, 
CT.NAME AS componentName from 
CHECK_SUMMARY CS INNER JOIN CHECKTYPE CT 
ON CT.ID=CS.CHECKTYPE_ID 
where CS.ORIGINALCHECK_ID='ODDV-1803-015232-HL01'' 
and CS.CASE_ID=15232

请任何人帮助我解决这个问题。

我在调试时需要如下查询。

 select CS.ORIGINALCHECK_ID AS checkId, 
CS.CHECKTYPE_ID AS checkTypeId, 
CS.CHECKTYPE_ID AS componentID, 
CT.NAME AS componentName from 
CHECK_SUMMARY CS INNER JOIN CHECKTYPE CT 
ON CT.ID=CS.CHECKTYPE_ID 
where CS.ORIGINALCHECK_ID='ODDV-1803-015232-HL01' 
and CS.CASE_ID=15232

【问题讨论】:

不要使用连接,因为它非常不安全(SQL 注入攻击)。使用参数化 SQL,即对每个参数使用问号 (?),然后应用参数值。 【参考方案1】:

根据您的代码 sn-p 以及您已标记“BPM”这一事实,您似乎在询问有关在产品 IBM BPM 中执行 SQL 的问题。虽然您没有说出产品的版本,但我认为它是 7.5 或更高版本。

假设所有这些都是正确的,您应该使用 System Data Toolkit 中的“SQL Execute Statement”服务执行查询。您正在尝试创建完整的 SQL 语句,而不是利用参数化查询功能(这将执行 @The Impaler 的建议)

您需要修改您的 SQL 以便它可以使用参数化选项。代码应该类似于 -

tw.local.sql="select CS.ORIGINALCHECK_ID AS checkId, "+
"CS.CHECKTYPE_ID AS checkTypeId, "+
"CS.CHECKTYPE_ID AS componentID, "+
"CT.NAME AS componentName "+
"from CHECK_SUMMARY CS INNER JOIN CHECKTYPE CT "+
"ON CT.ID=CS.CHECKTYPE_ID "+
"where CS.ORIGINALCHECK_ID=? and CS.CASE_ID=?";

然后,您可以使用以下内容设置参数值 -

tw.local.parameters = new tw.object.listOf.SQLParameter();
tw.local.parameters[0] = new tw.object.SQLParameter();
tw.local.parameters[0].value = tw.local.subBarCode;
tw.local.parameters[0].type = 'VARCHAR'; //Note: Guessing here.
tw.local.parameters[1] = new tw.object.SQLParameter();
tw.local.parameters[1].value = tw.local.caseID;
tw.local.parameters[1].type = 'INTEGER';

然后,您将它们都交给 SQL 执行语句服务,一切都应该正常工作。您受到 SQL 注入的保护,并且如果您的变量之一在字符串中说出 ',则不会神奇地中断。

根据底层 JDBC 驱动程序的默认行为,有时您可以在不指定类型的情况下逃脱。 SQLParameter 业务对象记录了该类型的可能输入。

【讨论】:

我还要注意 tw.local.sql 变量应该使用“scriptlet”而不是编写 JS 代码来设置。这种方式更具可读性。【参考方案2】:

您是否尝试过解码参数中的任何内容?

请看这篇帖子:html Entity Decode

【讨论】:

以上是关于如何在选择查询中分配字符串变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在C ++中分配`#input`类型的宏字符串?

如何在一个表的键中分配多个值?

如何从查询字符串中分离“选择顶部 * x”?

freenode IRC 如何在其加入地址中分配用户字符串。即 nick!user@host

如何在字符串中分隔 SQL 变量

如何查找变量是在堆栈还是堆中分配?