Sqlplus 通过文件参数化查询

Dar*_*ten 6 oracle oracle-10g sqlplus

我想通过 sqlplus 使用文本文件中提供的所有参数向 Oracle 发出参数化。有没有办法做到这一点?该查询包含的参数超出了提示人员的合理范围,我们希望在为此输入参数时消除用户错误。

我们需要发出参数化查询的原因是,我们看到直接 sql 语句和在我们的应用程序中作为参数化查询发出的相同查询之间的性能存在巨大差异。我们希望从链中删除任何应用程序代码,并且仅使用 Oracle 工具就可以明显看出差异。

Ale*_*ole 5

如果您希望 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;
Run Code Online (Sandbox Code Playgroud)

并将参数值放在文本文件中,例如parms.txt

SYS
OSUSER
Run Code Online (Sandbox Code Playgroud)

并把它放在一起:

sqlplus -s user/password @query `cat parms.txt`
Run Code Online (Sandbox Code Playgroud)

(这显然是针对 Unix 的;不确定 Windows 的命令行等效项是什么)。更改parms.txt或使用不同的文件,您每次仍将获得相同的硬解析计划。

您的性能问题听起来可能与绑定变量窥视有关,尤其是“陷入糟糕计划”的描述。执行计划由第一次查询运行决定,可能会为这些参数选择合适的索引等;即使不同的索引可能更适合新参数,后续运行也会使用相同的计划。独立的 SQL 将有一个单独的解析,因此可能会有不同(更合适)的计划。在过去,我不得不手动收集统计数据以防止使用直方图,这至少可以稳定事物。