【发布时间】:2020-05-11 04:44:13
【问题描述】:
我是一名 SQL Server DBA,目前正在熟悉 Oracle。我正在尝试为 SQL Server 创建与 sp_WhoIsActive 非常相似的东西,但为 Oracle 创建一些东西,而无需重新发明轮子。基本上我所做的只是从 v$session 中选择一些值并将它们插入到表中(穷人的 ASH/AWR)。
在 Oracle 12.1 中,查询字典视图时似乎存在一个错误,由于解析逻辑错误(错误 22225899:复杂查询的慢解析),它可能会永远持续下去。解决方法是设置会话参数:
alter session set "_optimizer_squ_bottomup"=false;
在 T-SQL 中,我可以非常轻松地在会话中执行存储过程并在运行时设置此变量。但是在 Oracle 中,情况似乎并非如此。
示例代码:
CREATE OR REPLACE PROCEDURE SP_DB_ACTIVITY
(
v_temp NUMBER :=1
) IS
BEGIN
alter session set "_optimizer_squ_bottomup"=false;
INSERT INTO SY_DB_ACTIVITY
SELECT
<fields>
FROM
v$session;
commit;
当我运行它时,我得到了错误:
“PLS-00103:在预期以下之一时遇到符号 'ALTER'...”
目前,我知道如何做到这一点的唯一方法是通过 SQL Plus 之类的实用程序启动交互式用户会话。谁能给我一些关于 Oracle 如何处理这种情况的指导?我想将它捆绑到一个 SP 或一个包中,然后从 Oracle 调度程序中调用它。
【问题讨论】:
-
“穷人的 ASH/AWR” 我建议您熟悉一下 Tanel Poder 的
snapper实用程序。 Find it here -
立即执行就是你想要的
-
@thatjeffsmith 如下答案所示:)
-
我刚刚投了赞成票
-
感谢大家的澄清。很高兴知道 EXECUTE IMMEDIATE 在 PLSQL 块的会话中运行。干杯!
标签: sql oracle plsql oracle-sqldeveloper oracle12c