首页 文章

Oracle程序移动表空间

提问于
浏览
0

朋友......我正在测试这个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 回答

  • 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;
    

    分享和享受 .

相关问题