【发布时间】:2014-12-04 11:23:57
【问题描述】:
我在获取 SQL 计划时遇到问题。
在最终形式中,我必须通过 PL*SQL 获取它们。
所以我有一个 bash 脚本,一个循环遍历 sql 计划名称和参数,以及这样的代码:
sqlplus -s /nolog > /dev/null 2>&1 <<EOF
CONNECT BLAH/BLAH@BLAH
*CLEAR AND SET COMMANDS HERE*
VARIABLE RC REFCURSOR;
SPOOL ${BERICHT}_${configArray[0]}.DATA
SET TIMING ON;
EXEC :RC := $aktuellesBericht;
SET TIMING OFF;
PRINT RC;
DISCONNECT
QUIT
EOF
第二部分:(以 SYS 身份登录,但没有 SYSDBA 权限,我没有它们,我认为我不会拥有它们...)
sqlplus -s /nolog > /dev/null 2>&1 <<EOF
CONNECT SYSBLAH/SYSBLAH@BLAH
SPOOL ${BERICHT}_${configArray[0]}.SQLPLAN.TXT
CLEAR BREAK
CLEAR COMP
CLEAR COL
select
sqlplan.operation,
sqlplan.options,
sqlplan.object_name,
sqlplan.cost,
sqlplan.depth
from v\$sqlarea sqlarea,
v\$session sesion,
v\$sql_plan sqlplan
where sesion.sql_hash_value = sqlarea.hash_value
and sesion.sql_address = sqlarea.address
and sqlarea.plan_hash_value = sqlplan.plan_hash_value
and sesion.username = 'BLAH' order by sqlplan.depth;
QUIT
EOF
我能从中得到的只有 *.SQLPLAN.TXT 只包含一句话的文件:no rows selected
这里有什么奇怪的,当我在 PL/SQL Developer 中做同样的事情时 - 我得到了相同的结果,但是当我在两个 SQL 窗口上单击自动刷新计时器按钮时,两个查询并行运行,并且有时第二个查询(获取 SQL 计划的那个)会给我结果。有时它不会。
这些命令似乎需要并行运行......还是我遗漏了什么?
【问题讨论】:
-
可能不相关:但是你为什么使用这么复杂的SQL语句而不是
dbms_xplan? -
@a_horse_with_no_name 我很乐意,但我找不到在 ORacle 包上使用它的方法。
-
dbms_xplan.display_cursor将返回一个带有执行计划的 CLOB。返回值可以存储在变量中,例如:select dbms_xplan.display_cursor(...) into l_clob_variable from dual -
@a_horse_with_no_name 我试过类似的东西,但我得到:
User has no SELECT privilege on V$SESSION。我可以访问 2 个帐户 - 从一个我可以使用参数运行包,EXEC :RC := SOMEPACKAGE.SOMEFUNCTION(Some,parameters,here);,第二个是 SYS,我可以在其中使用 SQL 计划...管理员团队无法授予其他权限第一个帐户...
标签: oracle plsql sqlplus plsqldeveloper