朋友......我正在测试这个Oracle程序,将所有表,表空间的索引移动到新的表空间......我正在尝试调试并修复这个简单的过程,但它给了我光标错误...有人请指点我的错误?
我可以手动生成一些东西,但是我有200个表空间,我打算定期移动,所以想要自动完成这个任务 .
目标:在过程运行时接受旧的表空间和新的表空间,并使用它将该表空间中的所有对象移动到新的表空间 .
-
我打算做以下事情:
-
在程序运行时接受old_tbs,new_tbs
-
将表A从old_tbs移动到new_tbs
-
将表A的索引重建为new_tbs
-
将表B从old_tbs移动到new_tbs
-
将表B的索引重建为new_tbs
环...
CREATE OR REPLACE procedure moveTbl (OldTbs in varchar2, NewTbs in varchar2)
IS
TblSQL VARCHAR2(250);
CURSOR curTable (vOwner varchar2, vTblName varchar2, vTbsName varchar2)
IS
SELECT owner, table_name, tablespace_name
FROM dba_tables
WHERE tablespace_name = OldTbs
ORDER BY 2;
rec1 curTable%ROWTYPE;
BEGIN
FOR rec1 IN curTable LOOP
dbms_output.putline('rec1.owner || rec1.table_name');
TblSQL := 'alter table '||rec1.owner||'.'||rec1.table_name||' move tablespace '||NewTbs;
EXECUTE IMMEDIATE TblSQL;
END LOOP; --curTable for loop
END moveTbl;
/
1 回答
您已将光标声明为具有三个参数,但在FOR循环中打开它时不提供任何参数 . 我建议这个游标不需要任何参数,它们应该被删除 .
也可能是创建此过程的模式/用户无法访问DBA_TABLES视图的情况 .
编辑
AUTHID CURRENT USER
应该在CREATE OR REPLACE PROCEDURE
之后但在IS
之前立即添加,如下所示:分享和享受 .