【发布时间】: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中使用用户定义的数据类型。