Indexing 在PLSQL中通过循环重建索引
在循环中,循环特定模式的所有索引并重新生成。我在循环的开头和ALTER语句的行中发现了一些错误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
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>