Indexing 在PLSQL中通过循环重建索引

Indexing 在PLSQL中通过循环重建索引,indexing,plsql,for-in-loop,rebuild,ora-00942,Indexing,Plsql,For In Loop,Rebuild,Ora 00942,在循环中,循环特定模式的所有索引并重新生成。我在循环的开头和ALTER语句的行中发现了一些错误 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 immedi

在循环中,循环特定模式的所有索引并重新生成。我在循环的开头和ALTER语句的行中发现了一些错误

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; 

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

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

啊,在PL/SQL之外,它可以工作-对不起,我之前没有注意到。事实是:通过角色获得的特权在系统中不起作用 PL/SQL。因此,如果是这种情况,请直接在DBA_对象上授予SELECT 发送给运行PL/SQL代码的用户

我删除了限制所有者的条件,因为在USER\u对象中没有这样的列

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

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

所以我应该使用DBA_对象还是用户_对象?需要任何授权吗?您不需要为用户\对象提供任何额外权限-所有者可以访问它(但您必须作为DRR \ U DEV用户连接)。如果您想使用DbAbObjts,则必须在其上获取直接选择特权。谢谢,无论如何,如果我可以排除从上面查询重建的IOT的主索引。请考虑从<代码> USER索引> /代码>中选择与索引相关的值,而不是<代码> UsSeriObjs</C>。
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>