Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Пересоздание внешней таблицы в 10g  [new]
algenda
Member

Откуда:
Сообщений: 34
Добрый день товарищи!

У меня есть следующая задачка. Надеюсь Вы мне сможете помочь её решить.

Установлен Oracle 10g XE. (на большой оракл денег не дают, воровать тоже нельзя)
Периодически на этот сервер нужно копировать достаточно большой объем данных (состояние таблиц в текущий момент времени). Один снимок данных весит порядка 700 Mb.
В связи с имеющимся ограничением 4Gb на объем БД хранить снимки данных в базе нельзя. Но в то же время они должны быть доступны для анализа.
Придумал следующий обход:
Данные экспортируем в дамп с помощью expdp
drop table table1_tmp;
create table table1_tmp
organization external
(
   type oracle_datapump
   default directory dp_dir
   location ('table1_15-MAR-07.DMP')
)
parallel 2
as
select col1,col2,'15-MAR-07' sh_date from table1@dblink;

Потом создаем внешнюю таблицу
DROP TABLE table1;
CREATE TABLE table1
   ( col1 varchar2(60),
     col2 varchar2(60),
     sh_date varchar(20))
ORGANIZATION EXTERNAL (                                                                       
  TYPE oracle_datapump
  DEFAULT DIRECTORY dp_dir
  LOCATION ('table1_10-MAR-07.DMP','table1_15-MAR-07.DMP')
  )      
PARALLEL
REJECT LIMIT 0;
В этой таблице объединяем все снимки корорые делали до сих пор (стока location).

Собственно вопросов два:
Как можно все это дело упаковать в процедуру, командный файл или батник так что бы не надо было каждый раз руками добавлять нужный файл в LOCATION?
Пока есть идея SQL*Plus-ом делать spool запроса
SELECT 'drop table table1;
CREATE TABLE table1 (
     col1 varchar2(60),
     col2 varchar2(60),
     sh_date varchar(20))
ORGANIZATION EXTERNAL (                                                                       
  TYPE oracle_datapump
  DEFAULT DIRECTORY dp_dir
  LOCATION (' from dual 
union (
SELECT CASE WHEN ROWNUM=1 THEN '' ELSE ',' END ||Chr(39)|| LOCATION ||Chr(39)
  FROM   
    DBA_EXTERNAL_LOCATIONS
  WHERE TABLE_NAME ='table1'
)
union (select 
')
  )      
PARALLEL
REJECT LIMIT 0;
'
from dual)

a потом подцеплять его SQL*Plus-ом.

Подозреваю что это не самый оптимальный способ.
Можно ли как нибудь по проще?

Вопрос 2: что то нигде не смог найти какое ограничение на количество файлов в параметре location для внешних таблиц?

Заранее спасибо!
15 мар 07, 16:22    [3903635]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание внешней таблицы в 10g  [new]
algenda
Member

Откуда:
Сообщений: 34
Мда. Облом...
Вылезает ошибка:

KUP-11011: file string is not valid for this load operation
Cause: The specified file could not be used for this load because the internal header
and/or table metadata of this file were not consistent with those of the first file listed in the LOCATION clause.
Action: Verify all the files listed in the LOCATION clause are from the same unload operation.

Жаль. А то обход 4Gb ограничения был так близок... =)
17 мар 07, 14:02    [3910492]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание внешней таблицы в 10g  [new]
Вова109
Member

Откуда:
Сообщений: 71
Используй процедуру

procedure loadf;
execute immediate 'drop table...';
execute immediate 'create table....';
end loadf;

а потом подцепи джоб, пусть он процедуру выполняет как тебе угодно
17 апр 07, 21:06    [4033656]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание внешней таблицы в 10g  [new]
algenda
Member

Откуда:
Сообщений: 34
Да, спасибо.
Я уже примерно так и сделал.
сделал вьюшку в которую юнионом собираются таблицы со снимками данных.
Там в итоге дело упирается снова в 4 Gb ограничения. Оказывается что оно работает на все данные которые можно получить с сервера лежат ли они в базе или во внешних таблицах.
В итоге все снимки складываю в дампах на диске, описание их храню в табличке, а когда нужны для анализа - подсоединяю по одному.
18 апр 07, 12:41    [4036143]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить