Как получить все XML имен файлов из каталога, используя EXTERNAL TABLE - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь получить все XML имена файлов, присутствующие в каталоге, чтобы передать их процедуре, которая извлекает данные из этих файлов. Может кто-нибудь помочь с тем, как я могу получить имя файла, используя ВНЕШНЮЮ ТАБЛИЦУ. У меня проблемы с параметрами доступа и файлом местоположения. Не знаю, что именно go там.

Спасибо

CREATE TABLE S7303786.XML_FILES
    (
      FILE_NAME VARCHAR2(255 CHAR)
    )
     ORGANIZATION EXTERNAL
         (
          TYPE ORACLE_LOADER
          DEFAULT DIRECTORY AUTOACCEPT_XMLDIR
          ACCESS PARAMETERS
          (
          RECORDS DELIMITED BY NEWLINE
           PREPROCESSOR AUTOACCEPT_XMLDIR: 'list_file.sh'
          FIELDS TERMINATED BY WHITESPACE
          )
          LOCATION ('list_file.sh')
         )
REJECT LIMIT UNLIMITED;

list_files. sh просто содержит каталог, в котором находятся файлы. В файле sticky.txt ничего нет

получаются следующие ошибки:

ORA-29913: ошибка при выполнении вызова ODCIEXTTABLEFETCH ORA-29400: ошибка картриджа данных KUP-04004: ошибка при чтении файла / главная / передача / сту / nshstrans / sticky.txt

1 Ответ

0 голосов
/ 24 февраля 2020

Ошибка, которую вы получили, может быть связана с объектом directory , Oracle, который указывает на физический каталог на диске сервера базы данных. Он создается привилегированным пользователем - SYS, который затем предоставляет read и / или write привилегии для него пользователям, которые будут его использовать.

Если вы пропустили что-либо из вышеупомянутых вещей ваша внешняя таблица не будет работать.

Итак:

SQL> show user
USER is "SYS"
SQL>
SQL> create directory mydir as 'c:\temp';

Directory created.

SQL> grant read, write on directory mydir to scott;

Grant succeeded.

SQL>

Подключитесь к Скотту и создайте внешнюю таблицу:

SQL> connect scott/tiger
Connected.
SQL> create table extusers
  2    (username varchar2(20),
  3     country  varchar2(20)
  4    )
  5  organization external
  6    (type oracle_loader
  7     default directory mydir          --> this is directory I created
  8     access parameters
  9       (records delimited by newline
 10        fields terminated by ';'
 11        missing field values are null
 12          (username char(20),
 13           country  char(20)
 14          )
 15       )
 16     location ('mydata.txt')          --> name of the file that contains data
 17    )                                 --  located in c:\temp, which is MYDIR
 18  reject limit unlimited              --  directory
 19  /

Table created.

SQL>

Содержимое образца текстового файла:

SQL> $type c:\temp\mydata.txt
Littlefoot;Croatia
Michel;France
Maaher;Netherlands
SQL>

Наконец, давайте выберем из внешней таблицы:

SQL> select * from extusers;

USERNAME             COUNTRY
-------------------- --------------------
Littlefoot           Croatia
Michel               France
Maaher               Netherlands

SQL>

Работает хорошо, не так ли? Теперь попробуйте сделать то, что я сделал.


При втором чтении

выясняется, что вы не хотите читать содержимое файла, но directory содержание. Если это так - очевидно, это так - тогда посмотрите, поможет ли это.

Чтобы заставить его работать, привилегированный пользователь должен предоставить каталогу дополнительную привилегию - EXECUTE.

SQL> show user
USER is "SYS"
SQL> grant execute on directory mydir to scott;

Grant succeeded.

Следующим шагом является создание исполняемого файла операционной системы (на MS Windows я использую это скрипт .bat; на Unix это будет .sh, я думаю), который будет список каталога. Обратите внимание на первую строку - мне нужно перейти к каталогу, который является source для Oracle объекта каталога. Если вы этого не сделаете, это не сработает. Файл .bat прост:

SQL> $type c:\temp\directory_contents.bat
cd c:\temp
dir /b *.txt
SQL>

Создать внешнюю таблицу:

SQL> create table extdir
  2    (line varchar2(50))
  3    organization external
  4      (type oracle_loader
  5       default directory mydir
  6       access parameters
  7         (records delimited by newline
  8          preprocessor mydir:'directory_contents.bat'
  9          fields terminated by "|" ldrtrim
 10         )
 11       location ('directory_contents.bat')
 12      )
 13    reject limit unlimited
 14  /

Table created.
SQL> connect scott/tiger
Connected.

Посмотрим, что он вернет:

SQL> select * From extdir;

LINE
-----------------------------------------------


c:\Temp>dir /b *.txt
a.txt
dept.txt
emp.txt
emps.txt
externalfile1.txt
lab18.txt
mydata.txt
p.txt
parfile_01.txt
sofile.txt
test.txt
test2.txt

15 rows selected.

SQL>

Ну ... да, это мои .txt файлы, расположенные в каталоге c:\temp.


Поскольку вы используете * nix, я думаю, что возникшая проблема связана со скриптом list_files.sh. Вы не публикуете его содержимое (что, вероятно, поможет - не обязательно поможет me , поскольку я забыл почти все, что я знал о * .nix), но - относительно Предварительная обработка внешних таблиц (написано Майкл Маклафлин) вам может понадобиться

prepend / usr / bin перед программами ls, find и sed: /usr/bin/ls ...

Посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...