【问题标题】:Rebuild index through loop in PLSQL通过 PLSQL 中的循环重建索引
【发布时间】:2018-04-23 07:29:41
【问题描述】:
FOR r IN (select 'DRR_DEV.' ||object_name as obj from dba_objects where object_type = 'INDEX' 
and owner ='DRR_DEV')
  LOOP
        l_sql := 'ALTER INDEX '||r.obj||' REBUILD'||'';
        execute immediate l_sql;
  END LOOP; 

在 FOR..IN 循环之上,循环特定模式的所有索引并重建。我在循环开始和 ALTER 语句行几乎没有错误。

PL/SQL: SQL Statement ignored
PL/SQL: ORA-00942: table or view does not exist
PL/SQL: Statement ignored
PLS-00364: loop index variable 'R' use is invalid

我可以手动运行 select 语句,但不能通过 PLSQL 块,可能会出现什么问题?

【问题讨论】:

    标签: indexing plsql for-in-loop rebuild ora-00942


    【解决方案1】:

    您似乎没有访问 DBA_OBJECTS 的权限。要么以 SYS 身份连接并运行这样的代码,要么向其他用户授予所需的权限,或者 - 甚至更好 - 以 DDR_DEV 身份连接。

    啊,在 PL/SQL 之外它可以工作 - 抱歉,之前没有注意到这一点。事实是:通过角色获得的特权将不起作用 PL/SQL。因此,如果是这种情况,请直接授予 SELECT ON DBA_OBJECTS 给运行您的 PL/SQL 代码的用户。

    我删除了限制 OWNER 的条件,因为 USER_OBJECTS 中没有这样的列。

    这是在我的 SCOTT 用户上运行的示例:

    SQL> CREATE TABLE test (id NUMBER);
    
    Table created.
    
    SQL> CREATE INDEX i1
      2     ON test (id);
    
    Index created.
    
    SQL> DECLARE
      2     l_sql   VARCHAR2 (100);
      3  BEGIN
      4     FOR r IN (SELECT object_name AS obj
      5                 FROM user_objects
      6                WHERE object_type = 'INDEX'             -- AND owner = 'DRR_DEV'
      7                                           )
      8     LOOP
      9        l_sql := 'ALTER INDEX ' || r.obj || ' REBUILD' || '';
     10        DBMS_OUTPUT.put_line (l_sql);
     11
     12        EXECUTE IMMEDIATE l_sql;
     13     END LOOP;
     14  END;
     15  /
    ALTER INDEX I1 REBUILD
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    【讨论】:

    • 所以我应该使用 DBA_OBJECTS 还是 USER_OBJECTS?需要任何资助吗?
    • 您不需要为 USER_OBJECTS 提供任何额外权限 - 所有者可以访问它(但您必须以 DRR_DEV 用户身份连接)。如果你想使用 DBA_OBJECTS,那么你必须获得对它的直接 SELECT 权限。
    • 谢谢,无论如何,如果我可以排除要从上述查询重建的 IOT 上的主索引?
    • 考虑从USER_INDEXES而不是USER_OBJECTS中选择与索引相关的值。
    • 这就是我使用 select index_name from user_indexes where index_type = 'NORMAL' 的地方。仍然得到 ORA-02243: 错误。
    猜你喜欢
    • 2013-04-16
    • 2020-08-19
    • 2018-04-19
    • 1970-01-01
    • 2019-08-26
    • 2023-03-25
    • 2021-03-22
    • 2019-03-21
    • 2019-06-27
    相关资源
    最近更新 更多