【问题标题】:Oracle: Setting Session Parameters in Packages and ProceduresOracle:在包和过程中设置会话参数
【发布时间】: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


【解决方案1】:

这里是一个简单的例子,如何在过程中执行alter session

CREATE PROCEDURE SP_DB_ACTIVITY IS
BEGIN

EXECUTE IMMEDIATE 'alter session set "_optimizer_squ_bottomup"=false';

END;
/

您可以通过以下方式将其与您的 select 和 insert 语句结合起来:

CREATE OR REPLACE PROCEDURE SP_DB_ACTIVITY
(v_temp IN number) AS 

    v_Id NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'alter session set "_optimizer_squ_bottomup"=false';

    SELECT 1 
    INTO v_Id
    FROM dual;

    INSERT INTO SY_DB_ACTIVITY (id) VALUES(v_Id); 
 END SP_DB_ACTIVITY; 
 /

Here is a small DEMO 在这里您可以看到调用它时程序会做什么以及如何调用它。此外,在此示例中,您正在使用和 IN 参数调用过程。所以你可以用这个参数做一些事情,在上面的例子中是没有任何参数的过程......

当然也可以直接插入到表格中:

CREATE OR REPLACE PROCEDURE SP_DB_ACTIVITY
(v_temp IN number) AS 

    v_Id NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'alter session set "_optimizer_squ_bottomup"=false';

    INSERT INTO SY_DB_ACTIVITY(id) 
    select 1
    from dual; 

 END SP_DB_ACTIVITY; 
 /

【讨论】:

  • 谢谢!我的印象是在会话之外执行立即执行(即“嘿,执行这个,提交它并关闭它”),我的假设很糟糕。干杯!
  • 嗨@ChaseMarler,我很高兴它有帮助......这是你要找的吗?
猜你喜欢
  • 2013-04-25
  • 2022-07-22
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多