在多个用户上使用EXEC SYS.DBMS_STATS.LOCK_TABLE_STATS命令

时间:2019-01-28 14:01:02

标签: oracle plsql oracle11g

我需要执行查询

EXEC SYS.DBMS_STATS.LOCK_TABLE_STATS('MCCANE', 'SDE_LOGFILE_DATA');

同时为多个用户

(MCCANE是用户之一)。有办法吗?

1 个答案:

答案 0 :(得分:1)

假设您要对数据库中的所有表(共享相同的名称)执行相同的操作。如果是这样,请编写一段代码使之成为可能。为此,

  • 遍历DBA_TABLES
  • 搜索拥有此类表的用户(即 owner
  • 编写一个语句(放入我的L_STR变量中),
  • 首先显示它(以确保正确编写),如果显示-
  • 将其作为动态SQL(execute immediate)运行。

这是一个例子;我正在使用DEPT表(因为我没有SDE_LOGFILE_DATA)。

SQL> show user
USER is "SYS"
SQL> set serveroutput on
SQL> declare
  2    l_str varchar2(100);
  3  begin
  4    for cur_r in (select owner from dba_tables
  5                  where table_name = 'DEPT'
  6                 )
  7    loop
  8      l_str := q'[sys.dbms_stats.lock_table_stats(']' || cur_r.owner || q'[', 'DEPT')]';
  9      l_str := 'begin ' || l_str ||'; end;';
 10      dbms_output.put_line(l_str);     -- if everything's OK, comment this ...
 11      -- execute immediate l_str;      -- ... and uncomment that
 12    end loop;
 13  end;
 14  /
begin sys.dbms_stats.lock_table_stats('MIKE', 'DEPT'); end;
begin sys.dbms_stats.lock_table_stats('HR', 'DEPT'); end;
begin sys.dbms_stats.lock_table_stats('SCOTT', 'DEPT'); end;

PL/SQL procedure successfully completed.

SQL>