SELECT .. WHERE column IN (..) 查询的解析和绑定变量

Roy*_*Roy 2 oracle parse php

我希望确保 php web 应用程序中的所有查询都正确使用了绑定变量,以尽量减少对查询的解析。

我想知道 Oracle 如何解析将列与值列表进行比较的查询。Oracle 会认为这些语句是相同的,还是列表必须在绑定变量内?

select char from alphabet where char not in ('a', 'b');

select char from alphabet where char not in ('c', 'd');
Run Code Online (Sandbox Code Playgroud)

如果列表的内容必须在绑定变量中,是否可以使用单个变量来完成,或者必须将列表中的每个项目放在一个单独的变量中?

select char from alphabet where char not in (:list);

select char from alphabet where char not in (:c1, :c2);
Run Code Online (Sandbox Code Playgroud)

如果后者为真,列表中具有不同项数的查询是否仍被认为具有相同的结构?

select char from alphabet where char not in (:c1, :c2);

select char from alphabet where char not in (:c1, :c2, :c3);
Run Code Online (Sandbox Code Playgroud)

Chr*_*xon 5

您必须绑定一个 IN 列表的元素,否则 Oracle 将考虑这些单独的语句。SQL 文本中的任何差异都将导致解析新语句(某些情况除外cursor_sharing = force)。因此,您使用:a, :b和的示例:a, :b, :c将被视为不同的 SQL 语句。

每个元素必须绑定到一个单独的变量。如果绑定'fred,nick'到一个变量,Oracle 将查找字符串“fred,nick”,而不是单独的项 fred 和 nick。

如果您有变量 in-list,但不想为每个附加项目解析一个新语句,您需要将元素作为逗号分隔的字符串传递到一个绑定变量中,然后自己解析元素。

汤姆凯特讨论了几种方法可以做到这一点在这里。基本上,您可以通过编写一个返回嵌套表的table函数来实现此目的,您可以将其包装成一个函数以使其成为行源。或者,它可以在纯 SQL 中完成,通过使用connect by level <= :num_of_rows技巧来生成您需要的元素数量并以这种方式解析绑定变量。