2015-03-25 3 views
0

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

Редактировать: Также как примечание, я знаю, что вы можете использовать препроцессор для подачи в заархивированном файле во внешнюю таблицу. Если я хочу прочитать zipped-файл И добавить имя файла так же просто, как просто поместить его в один файл оболочки?

CREATE TABLE (
    column1 VARCHAR2(40), 
    column2 VARCHAR2(40) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DMPDIR 
    ACCESS PARAMETERS(
     RECORDS DELIMITED BY NEWLINE 
     LOGFILE DMPDIR:'test.log' 
     BADFILE DMPDIR:'test.bad' 
     fields terminated by '^' 
     MISSING FIELD VALUES ARE NULL 
     REJECT ROWS WITH ALL NULL FIELDS 
     preprocessor DMPDIR: 'append_filename.sh' 
    ) 
LOCATION (DMPDIR: 'testfile.dat') 
); 

append_filename.sh

#!/bin/bash 
sed -e 's!$!,'"${1##*/}"'!' $1 
+0

Должны ли мы предположить ошибки? Предполагаем ли вы угадать вашу версию Oracle? –

+0

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

+0

Я отправил пример в свой ответ. –

ответ

2

Вот небольшой пример, чтобы создать external table используя препроцессор. Я сделал это на 12с:

SQL> select banner from v$version where rownum = 1; 

BANNER 
---------------------------------------------------------------------------- 
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 

SQL> DROP TABLE validation_header; 

Table dropped. 

SQL> 
SQL> CREATE TABLE validation_header (
    2 header1 VARCHAR2(5), 
    3 header2 number, 
    4 header3 VARCHAR2(8), 
    5 header4 number 
    6 ) 
    7 ORGANIZATION EXTERNAL (
    8 TYPE oracle_loader 
    9 DEFAULT DIRECTORY data_pump_dir 
10 ACCESS PARAMETERS (
11 RECORDS DELIMITED BY NEWLINE 
12 PREPROCESSOR import_ppm:'script.ksh' 
13 LOGFILE import_ppm:'script.log' 
14 FIELDS TERMINATED BY ',' 
15 (header1,header2,header3, header4 
16 )) 
17 LOCATION ('script_file.txt') 
18 ); 

Table created. 

SQL> 

Из документации,

KUP-04094: preprocessing cannot be performed if Database Vault is installed

  • Cause: The Database Vault option did not permit the execution a program from an Oracle directory object.

  • Action: If preprocessing must be performed, then the Database Vault option must not be installed.

+0

Я предполагаю, что это проблема с нашей базой данных, так как я получаю ту же проблему с вашим примером. Разработчик SQL показывает красную строку синтаксической ошибки в начале строки препроцессора со следующей ошибкой: KUP-04094: предварительная обработка не может быть выполнена, если установлено хранилище базы данных 29913. 00000 - «ошибка при выполнении вызова% s» –

+0

См. Мое обновление в ответ. –

+0

Не хорошие новости, мы часто используем хранилище данных для доступа, поэтому нет шансов на то, что он будет куда угодно. Мне придется отказаться от препроцессора и выполнить предварительную обработку в Perl или что-то еще до того, как оно поступит во внешние таблицы. –

 Смежные вопросы

  • Нет связанных вопросов^_^