Ошибка, которую вы получили, может быть связана с объектом 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 ...
Посмотрите, поможет ли это.