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