如何在包中调用dbms_stats

时间:2018-04-22 06:06:08

标签: oracle

我有一个包在下面

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,提交或回滚

如何进行?

1 个答案:

答案 0 :(得分:2)

调用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后运行它。