Oracle

Sqlplus通過文件進行參數化查詢

  • June 12, 2015

我想通過 sqlplus 使用文本文件中提供的所有參數向 Oracle 發出參數化。有沒有辦法做到這一點?該查詢的參數超出了提示人員的合理範圍,我們希望在為此輸入參數時消除使用者錯誤。

我們需要發出參數化查詢的原因是,我們看到直接 sql 語句和在我們的應用程序中作為參數化查詢發出的相同查詢之間的性能存在巨大差異。我們希望從鏈中刪除任何應用程式碼,並且僅使用 Oracle 工具就可以看出差異。

如果您希望 SQL 在一個文件中,而參數在另一個文件中,這是一個選項。將位置參數query.sql分配給綁定變數,然後執行查詢:

variable p_owner varchar2(30);
variable p_column varchar2(30);

set verify off
set feedback off

begin
   :p_owner := '&1';
   :P_column := '&2';
end;
/

set feedback on

select table_name
from all_tab_columns
where owner = :p_owner
and column_name = :p_column;

exit 0;

並將參數值放入文本文件中,例如parms.txt

SYS
OSUSER

並將其與:

sqlplus -s user/password @query `cat parms.txt`

(顯然,這是針對 Unix 的;不確定命令行等效項對於 Windows 是什麼)。更改parms.txt或使用不同的文件,您每次仍然會得到相同的硬解析計劃。

您的性能問題聽起來可能與綁定變數窺視有關,特別是“陷入錯誤計劃”的描述。執行計劃由第一次查詢執行確定,可能會為這些參數選擇合適的索引等;即使不同的索引可能更適合新參數,後續執行也會使用相同的計劃。獨立的直接 SQL 將有一個單獨的解析,因此可能有不同的(更合適的)計劃。在過去,我不得不手動收集統計數據以防止使用直方圖,這至少可以穩定事情。

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