Процедура Oracle для перемещения табличного пространства

Друзья... Я тестирую эту процедуру Oracle для перемещения всех таблиц, индексов табличного пространства в новое табличное пространство... Я пытаюсь отладить и исправить эту простую процедуру, но она выдает ошибку курсора... может кто-нибудь указать моя ошибка?

Я могу сгенерировать что-то вручную, но там есть 200 табличных пространств, которые я планирую перемещать через равные промежутки времени, поэтому хочу автоматизировать эту задачу.

Цель: принять старое табличное пространство и новое табличное пространство при выполнении процедуры и использовать их для перемещения всех объектов в этом табличном пространстве в новое табличное пространство.

  1. I plan to do something like below:
    1. Accept old_tbs, new_tbs at procedure run
    2. Переместите таблицу A из old_tbs в new_tbs
    3. Перестроить индексы таблицы A в new_tbs
    4. Переместите таблицу B из old_tbs в new_tbs
    5. Перестроить индексы таблицы 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;
/

person homer    schedule 18.08.2014    source источник
comment
Это может больше подходить для администраторов баз данных.   -  person    schedule 18.08.2014
comment
Какую именно ошибку вы получаете?   -  person YasirA    schedule 18.08.2014
comment
@Yarsir, сообщение об ошибке LINE/COL ERROR ---------------------- --------------------------------- -------------------------------- 8/6 PLS-00341: объявление курсора 'CURTABLE' неполное или неправильное 8 /4 PL/SQL: оператор SQL игнорируется 12 сентября PL/SQL: ORA-00942: таблица или представление не существует 7/13 PL/SQL: элемент игнорируется 16/3 PL/SQL: оператор игнорируется 15/16 PLS-00306 : неправильное количество или типы аргументов при вызове 'CURTABLE'   -  person homer    schedule 18.08.2014
comment
@MikeW, никогда не знал о разделе dba ... создал там вопрос ...   -  person homer    schedule 18.08.2014


Ответы (1)


Вы объявили курсор с тремя параметрами, но не указали никаких параметров при его открытии в цикле 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;

Делитесь и наслаждайтесь.

person Bob Jarvis - Reinstate Monica    schedule 18.08.2014
comment
У пользователя есть доступ к dba_tables, я это проверил. посмотрю на параметр курсора... спасибо - person homer; 18.08.2014
comment
Как отмечалось выше @AlexPoole, доступ рассматриваемого пользователя мог быть предоставлен через роль. Чтобы проверить это, выполните SET ROLE NONE, а затем попробуйте запросить DBA_TABLES — если запрос не выполнен, это означает, что доступ предоставлен через роль. Возможный обходной путь — добавить AUTHID CURRENT USER к объявлению процедуры. Делитесь и наслаждайтесь. - person Bob Jarvis - Reinstate Monica; 18.08.2014
comment
да, Алекс, и вы правы... после того, как пользователь SET ROLE NONE не смог запросить dba_tables (это что-то новое)... как добавить AUTHID CURRENT USER в объявление процедуры... - person homer; 18.08.2014
comment
@homer: я отредактировал ответ, включив в него определение процедуры с добавлением AUTHID CURRENT USER. - person Bob Jarvis - Reinstate Monica; 18.08.2014
comment
спасибо и отличное решение ... Я могу правильно скомпилировать процедуру, а также могу выполнить dbms_output.put_line для печати alter table table_name move tablespace new_tablespace, но когда это выполняется, происходит сбой с ora-01031: недостаточная привилегия ... Я попытался вручную запустить alter table команда move... но она работает без ошибок... так что интересно, это что-то с разрешения пользователя или выполнение перемещения таблицы с помощью другой процедуры? - person homer; 18.08.2014
comment
Я должен был бы подумать, что это как-то связано с разрешениями пользователей, но это область, с которой я не так хорошо знаком, как хотелось бы. Вероятно, вам следует обсудить это с вашим местным администратором баз данных. - person Bob Jarvis - Reinstate Monica; 18.08.2014