【问题标题】:Oracle PL/SQL Query With Dynamic Parameters in Where Clause在 Where 子句中使用动态参数的 Oracle PL/SQL 查询
【发布时间】:2018-10-19 17:19:24
【问题描述】:

我正在尝试编写一个动态查询,该查询可能具有不同数量的不同类型的参数。我遇到的唯一问题是处理该值是否为字符串,因此需要在其周围加上单引号。我正在使用名为 key_ref_ 的字段的值来确定我的 where 子句的外观。一些例子是:

LINE_NO=1^ORDER_NO=P6002277^RECEIPT_NO=1^RELEASE_NO=1^

PART_NO=221091^PART_REV=R02^

目前我正在用 ' 和 ' 替换 '^',如下所示:

REPLACE( key_ref_, '^' ,' and ' );

然后我尝试像这样创建动态查询:

EXECUTE IMMEDIATE
'select '||column_name_||' into column_ from '||base_table_||' where '||
 key_ref_ || 'rownum = 1';

这在值不是数字的情况下不起作用。

此外,我只添加了“rownum = 1”来处理末尾的额外“和”,而不是删除最后一次出现的情况。

【问题讨论】:

  • 不太清楚你的问题到底是什么。能否请您发布一些示例。
  • 你不应该那样做。由于 sql 注入有很多可能性,您必须为您的条件编写一个解析器。最好使用用户定义的数据类型来定义条件,然后使用 DBMS_SQL 而不是 EXECUTE IMMEDIATE 并将参数绑定到您的查询...
  • 我不需要担心 sql 注入,因为没有用户输入,它只是后台工作的一部分,但我会考虑改用 DBMS_SQL
  • 好吧,那还不错,但是绑定参数总是有用的,因为查询中的字符串文字会导致数据库缓存中的不同条目。这会影响整体系统性能适得其反...
  • @Radagast81 为什么你认为 DBMS_SQL 会比立即执行更好?注意,在较新的 Oracle 版本(即 >=12.1)中,您还可以在 EXECUTE IMMEDIATE 中使用用户定义的数据类型。

标签: oracle plsql


【解决方案1】:

如果输入没有波浪号(~),那么你可以试试下面的代码。 如果输入有波浪号,您可以将其替换为输入中不应存在的其他值

考虑到示例中提供的输入..

LINE_NO=1^ORDER_NO=P6002277^RECEIPT_NO=1^RELEASE_NO=1^PART_NO=221091^PART_REV=R02^

使用下面的代码

replace(replace(replace('LINE_NO=1^ORDER_NO=P6002277^RECEIPT_NO=1^RELEASE_NO=1^PART_NO=221091^PART_REV=R02^','^','~ and '),'=','=~'),'~',q'[']')

结果是

LINE_NO='1' and ORDER_NO='P6002277' and RECEIPT_NO='1' and RELEASE_NO='1' and PART_NO='221091' and PART_REV='R02' and 

系统将类型转换数字字段,所以不会有任何问题。

【讨论】:

  • 谢谢你的工作。 '~' 的目的是什么?
  • 我认为~ 只是一个随机字符,不会出现在您的动态字符串中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多