Копировать двоичные файлы можно с использованием сервера баз данных, полностью минуя операционную систему. Пакет DBMS_FILE_TRANSFER
позволяет копировать двоичные файлы на одном и том же сервере или передавать их между разными базами данных Oracle.
Требования к копированию файлов
Существуют некоторые условия, которые должны быть удовлетворены при использовании пакета DBMS_FILE_TRANSFER
для копирования файлов.
- Исходные файл должны быть того же типа, что и целевые файлы. То есть файлы в двух системах должны быть либо файлами операционной системы, либо файлами ASM.
- Файлы не могут быть размером больше 2 Тбайт, и размер каждого должен быть кратен 512 байт.
- Нельзя выполнять преобразование наборов символов при копировании файлов.
- Потребуется выдать явные привилегии всем непривилегированным пользователям базы данных, прежде чем они смогут использовать файлы, переданные пакетом
DBMS_FILE_TRANSFER
.
Копирование файлов в локальной системе
Копирование файлов между каталогами одного и того же сервера выполняется с помощью процедуры COPY_FILE
из пакета DBMS_FILE_TRANSFER
. Предположим, что необходимо скопировать файл по имени example.txt из каталога /u01/app/oracle в каталог /u01/app/Oracle/dba. Для этого потребуется выполнить следующие шаги.
- Создайте объект исходного каталога, указывающий на исходный каталог (source_dir):
SQL> CREATE DIRECTORY source_dir AS '/u01/app/oracle'; Directory created.
- Создайте объект целевого каталога, указывающий на целевой каталог (dest_dir):
SQL> CREATE DIRECTORY dest_dir AS '/u01/app/oracle/test'; Directory created. SQL>
- Воспользуйтесь процедурой COPY_FILE для копирования файла example.txt (DESTINATION_FILE_NAME) из исходного каталога в целевой (при желании, изменив его имя в процессе копирования):
SQL> BEGIN DBMS_FILE_TRANSFER.COPY_FILE( SOURCE_DIRECTORY_OBJECT => 'source_dir', SOURCE_FILE_NAME => 'example.txt', DESTINATION_DIRECTORY_OBJECT => 'dest_dir', DESTINATION_FILE_NAME => 'example.txt'); END; SQL> / PL/SQL procedure successfully completed. SQL>
Если теперь заглянуть в целевой каталог (/u01/app/oracle/test), там будет находиться копия исходного файла из исходного каталога (/u01/app/oracle).
Совет. Чтобы выполнить процедуру DBMS_FILE_TRANSFER.COPY_FILE, необходимо иметь привилегию READ в исходном каталоге и привилегию WRITE — в целевом.
Новый мастер OEM Database Control Load Data Wizard автоматизирует процесс создания управляющих файлов SQL*Loader. Вы специфицируете файлы данных и предоставляете информацию о их структуре, в Load Data Wizard использует ее для автоматической генерации контрольного файла SQL*Loader, а также создания задания SQL*Loader для загрузки файла данных в базу.
Передача файла в другую базу
Пакет DBMS_FILE_TRANSFER позволяет пересылать копии файлов с сервера на удаленный сервер посредством процедуры PUT_FILE. Вы выполняете те же шаги, что описаны в предыдущем разделе, но используете дополнительный параметр DESTINATION_DATABASE, чтобы указать удаленный сервер:
SQL> BEGIN DBMS_FILE_TRANSFER.PUT_FILE( SOURCE_DIRECTORY_OBJECT => 'source_dir', SOURCE_FILE_NAME => 'example.txt', DESTINATION_DIRECTORY_OBJECT => 'dest_dir', DESTINATION_FILE_NAME => 'e.txt', DESTINATION_DATABASE => 'finance'); END; SQL> / PL/SQL procedure successfully completed. SQL>
Совет. Прежде чем использовать процедуру PUT_FILE для пересылки файлов на удаленный сервер, следует удостовериться в существовании в локальной базе связи удаленной базы данных.
Процедура PUT_FILE сначала читает указанный файл на локальном сервере, а затем создает копию этого файла на удаленном сервере, который указывается в параметре DESTINATION_DATABASE. Таким образом, исходный каталог находится на локальном сервере, а удаленный каталог — на удаленном сервере.
Процедура GET_FILE является аналогом процедуры PUT_FILE и позволяет копировать файлы с удаленного сервера на локальный сервер. В этой процедуре целевой каталог и целевой файл находятся на локальном сервере, а исходный файл и каталог — на удаленном сервере. Вот структура GET_FILE:
DBMS_FILE_TRANSFER.GET_FILE( SOURCE_DIRECTORY_OBJECT IN VARCHAR2, SOURCE_FILE_NAME IN VARCHAR2, SOURCE_DATABASE IN VARCHAR2, DESTINATION_DIRECTORY_OBJECT IN VARCHAR2, DESTINATION_FILE_NAME IN VARCHAR2);