Oracle
為 SELECT .. WHERE column IN ( .. ) 查詢解析和綁定變數
我希望確保 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
技巧生成所需的元素數量並以這種方式解析綁定變數。