Oracle程序移动表空间

时间:2014-08-18 02:17:30

标签: oracle procedure

...友 我正在测试这个Oracle过程,将表空间的所有表,索引移动到新的表空间......我试图调试并修复这个简单的过程,但它给了我光标错误...有人可以指点我的错误?

我可以手动生成一些东西但是我有200个表空间,我计划定期移动,所以想要自动完成这项任务。

目标:在程序运行时接受旧的表空间和新的表空间,并使用它将该表空间中的所有对象移动到新的表空间。

  1. 我打算做以下事情:
    1. 在程序运行中接受old_tbs,new_tbs
    2. 将表A从old_tbs移至new_tbs
    3. 将表A的索引重建为new_tbs
    4. 将表B从old_tbs移至new_tbs
    5. 将表B的索引重建为new_tbs
  2. ...循环

    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 个答案:

答案 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;

分享并享受。