Изменять только параметры внешней таблицы BADFILE, LOGFILE и DISCARDFILE - PullRequest
2 голосов
/ 30 августа 2011

У меня есть несколько внешних таблиц, используемых для чтения файловых данных в БД, каждая из которых предназначена для конкретной спецификации файла.

Для файлов одного формата таблица используется повторно, указывая ее на новый каталог по умолчанию и новыйимя файла.Это работает нормально, за исключением того, что теперь мне нужно динамически изменять параметры BADFILE, LOGFILE и DISCARDFILE, оставляя при этом остальные параметры доступа без изменений.

Есть ли прямой способ сделать это без необходимости заново задавать все остальные параметры доступа (разделители полей преобразования столбцов и т. Д.)?

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

К сожалению, изменение только параметров BADFILE, LOGFILE и DISCARDFILE не может быть достигнуто без необходимости повторной настройки других параметров доступа.

Для чего стоит и для любого, кто найдет этот вопрос в будущем, я в конечном итогеобошла проблему с помощью следующего:

Выберите внешнюю таблицу и используйте REGEXP_REPLACE в ее параметрах доступа для замены частей параметра доступа BLOB, которые соответствуют BADFILE, LOGFILE и DISCARDFILE, и их связанных значений новыми значениями, которыеЯ предоставил.

  CURSOR external_table_cur(
     cp_external_table IN VARCHAR2,
     cp_new_log_dir IN VARCHAR2,
     cp_log_file IN VARCHAR2
  )
  IS
     SELECT table_name,
            REGEXP_REPLACE(
               access_parameters,
               <REGEX PATTERN>,
               cp_new_log_dir||':'''||LOWER(cp_log_file),
               1,
               0,
               'i'
            ) AS new_access_params
       FROM all_external_tables
      WHERE table_name = UPPER(cp_external_table);

Затем я использовал динамический SQL для изменения внешней таблицы и предоставил новые параметры доступа.

  -- Point external table to new file, directory and access params
  EXECUTE IMMEDIATE(
     'ALTER TABLE '
     || p_table_name
     || ' DEFAULT DIRECTORY '
     || p_directory
     || ' LOCATION ('''
     || p_filename
     || ''') '
     || ' ACCESS PARAMETERS ('
     || TO_CHAR(new_access_params)
     || ')'
  );

Это не идеально, и мне пришлось переопределить ВСЕпараметры доступа, но с использованием REGEX (и полного тестирования вывода) означали, что процесс не был слишком болезненным или медленным.

0 голосов
/ 15 июня 2018

Начиная с Oracle 12cR2, вы можете переопределять параметры для внешних таблиц в запросе .

Предложение EXTERNAL MODIFY инструкции SELECT изменяет параметры внешней таблицы.

Вы можете переопределить следующие пункты для внешней таблицы в предложении EXTERNAL MODIFY:

  • DEFAULT DIRECTORY

  • LOCATION

  • ПАРАМЕТРЫ ДОСТУПА

  • ПРЕДЕЛ ОТКЛОНЕНИЯ

Вы можете изменить более одного предложения в одном запросе.Переменная связывания может быть указана для LOCATION и REJECT LIMIT, но не для DEFAULT DIRECTORY или ПАРАМЕТРОВ ДОСТУПА.

Например:

SELECT *
FROM tab_ext EXTERNAL MODIFY (
                 ACCESS PARAMETERS (
                   BADFILE temp_dir_2:'some_tab_ext_%a_%p.bad'
                   LOGFILE temp_dir_2
                   DISCARDFILE temp_dir_2
                 )
              );
0 голосов
/ 30 августа 2011

Вы можете изменить предложение ACCESS PARAMETERS, оставив остальные без изменений.см. здесь http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/tables013.htm#i1007591 Обратите внимание, что, насколько я знаю, если вы хотите изменить только BADFILE, вам все равно придется повторить все действия в ПАРАМЕТРАХ ДОСТУПА.
Например:

ALTER TABLE ext_table
  ACCESS PARAMETERS
   (
     records delimited by newline 
     badfile admin_bad_dir:'empxt%a_%p.bad' 
     logfile admin_log_dir:'empxt%a_%p.log' 
     fields terminated by ',' 
     missing field values are null 
     ( field1, field2 ) 
  );
...