【问题标题】:how to call dbms_stats in a package如何在包中调用 dbms_stats
【发布时间】:2018-04-22 06:06:07
【问题描述】:

我有一个包裹在下面

CREATE PACKAGE p1
IS
   FUNCTION f1
      RETURN NUMBER;
END;


CREATE OR REPLACE PACKAGE BODY p1
IS
   FUNCTION f1
      RETURN NUMBER
   IS
   BEGIN
      RETURN 1;
   END;
BEGIN
   DBMS_STATS.gather_table_stats ('WMXT', 'EMP', estimate_percent => 10);
END;

当我尝试如下调用函数 f1 时

SELECT p1.f1 FROM DUAL;

我遇到了错误,

ORA-14552:无法在查询或 DML 中执行 DDL、提交或回滚

如何进行?

【问题讨论】:

  • 错误信息很清楚。从函数中删除统计信息收集步骤。
  • 调用dbms_stats的目的是在调用函数f1之前分析表。请让我知道如何实现这一目标。
  • 将统计信息收集步骤移至单独的过程并显式调用该过程,而不是在包初始化中。或者,使用没有查询的函数,例如declare i int := p1.f1; begin null; end;

标签: oracle


【解决方案1】:

DBMS_STATS 的调用是函数的一部分,还是您以后想做的事情?当前的包体甚至不应该编译(您可能需要修复它并进行编辑)。

如果 stats 是 f1 的一部分,请问自己为什么要从 select 中调用的函数收集统计信息?它不完全是主流,也可能不是正确的做法。话虽如此,我认为(未经测试)AUTONOMOUS_TRANSACTION 应该可以完成这项工作:

create or replace package body p1 is
  function f1 return number is
    pragma autonomous_transaction;
  begin
    dbms_stats.gather_table_stats('WMXT','EMP',estimate_percent=>10);
    return 1;
  end;
end;

另一方面,如果您想单独收集统计信息(根本不是 f1 或 p1 的一部分),请完全删除该部分并在编译 p1 后运行它。

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2012-08-22
    • 2019-12-21
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多