Oracle

為 SELECT .. WHERE column IN ( .. ) 查詢解析和綁定變數

  • January 8, 2013

我希望確保 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 文本中的任何差異都會導致解析新語句(某些情況除外cursor_sharing = force)。:a, :b因此,您的範例:a, :b, :c將被視為不同的 SQL 語句。

每個元素必須綁定到一個單獨的變數。如果綁定'fred,nick'到一個變數,Oracle 將查找字元串“fred,nick”,而不是單獨的項 fred 和 nick。

如果您有變數 in-lists,但不想為每個附加項解析新語句,則需要將元素作為逗號分隔的字元串傳遞給一個綁定變數,然後自己解析元素。

Tom Kyte 在這裡討論了幾種方法來做到這一點。基本上,您可以通過編寫一個返回嵌套表的函式來做到這一點,您可以將table函式包裝起來使其成為行源。或者,它可以在純 SQL 中完成,方法是使用該connect by level <= :num_of_rows技巧生成所需的元素數量並以這種方式解析綁定變數。

引用自:https://dba.stackexchange.com/questions/31597