我希望确保 php web 应用程序中的所有查询都正确使用绑定变量,以最大限度地减少查询的解析。
我想知道 Oracle 如何解析将列与值列表进行比较的查询。Oracle 会认为这些语句相同,还是列表必须在绑定变量内?
select char from alphabet where char not in ('a', 'b');
select char from alphabet where char not in ('c', 'd');
如果列表的内容必须在绑定变量中,是否可以使用单个变量来完成,或者必须将列表中的每一项都放在一个单独的变量中?
select char from alphabet where char not in (:list);
select char from alphabet where char not in (:c1, :c2);
如果后者为真,列表中项目数量不同的查询是否仍被认为具有相同的结构?
select char from alphabet where char not in (:c1, :c2);
select char from alphabet where char not in (:c1, :c2, :c3);
您必须绑定 IN 列表的元素,否则 Oracle 将考虑这些单独的语句。SQL 文本中的任何差异都将导致解析新语句(某些情况除外 when
cursor_sharing = force
)。:a, :b
因此,您使用和的示例:a, :b, :c
将被视为不同的 SQL 语句。每个元素必须绑定到一个单独的变量。如果绑定
'fred,nick'
到一个变量,Oracle 将查找字符串“fred,nick”,而不是单独的项 fred 和 nick。如果您有可变列表,但不想为每个附加项解析新语句,则需要将元素作为逗号分隔的字符串传递到一个绑定变量中,然后自己解析这些元素。
Tom Kyte 在这里讨论了执行此操作的几种方法。基本上,您可以通过编写一个返回嵌套表的函数来实现这一点,您可以将一个
table
函数包裹起来,使其成为行源。或者,它可以在纯 SQL 中完成,方法是使用connect by level <= :num_of_rows
技巧生成所需的元素数量并以这种方式解析绑定变量。