如何在选择查询中分配字符串变量
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
【讨论】:
以上是关于如何在选择查询中分配字符串变量的主要内容,如果未能解决你的问题,请参考以下文章