Файлы можно копировать непосредственно между базами данных через сеть Oracle Net, не используя команд операционной системы или утилит вроде FTP. С помощью пакета DBMS_FILE_TRANSFER выполняется копирование двоичных файлов в пределах одного сервера или передача их между серверами. Процедура COPY_FILE служит для копирования файлов в пределах локальной системы, процедура GET_FILE — для копирования файлов с удаленного сервера на локальный и процедура PUT_FILE — для чтения и копирования локального файла на удаленную файловую систему. Далее приводится краткое описание ключевых процедур нового пакета.
COPY_FILE
Процедура COPY_FILE позволяет копировать двоичные файлы из одного места в другое на одном и том же или на разных серверах. Прежде чем вы можно будет копировать эти файлы, необходимо создать объекты исходного и целевого каталога, как показано ниже:
SQL> CREATE OR REPLACE DIRECTORY source_dir as '/u01/app/oracle/source'; SQL> CREATE OR REPLACE DIRECTORY dest_dir as '/u01/app/oracle/dest';
После создания исходного и целевого каталогов можно применять процедуру COPY_FILE для копирования файлов:
SQL> BEGIN DBMS_FILE_TRANSFER.COPY_FILE( source_directory_object => 'SOURCE_DIR', source_file_name => 'test01.dbf', destination_directory_object => 'DEST_DIR', destination_file_name => 'test01_copy.dbf'); END; / SQL>
GET_FILE
Процедура GET_FILE используется для копирования двоичных файлов с удаленного сервера на локальный. Для начала подключитесь к удаленному серверу и создайте объект исходного каталога, как показано ниже:
SQL> CONNECT system/system_passwd@remote_db Connected. SQL> CREATE OR REPLACE DIRECTORY source_dir as '/u01/app/oracle/source';
Затем зайдите на локальный сервер и создайте объект целевого каталога:
SQL> CONNECT system/system_passwd@local_db Connected. SQL> CREATE OR REPLACE DIRECTORY dest_dir as /'u01/app/oracle/dest';
Создав исходный и целевой каталоги, удостоверьтесь в наличии связи между двумя базами данных и создайте ее в случае отсутствия:
SQL> CREATE DATABASE LINK prod1 CONNECT TO system IDENTIFIED BY system_passwd USING 'prod1'; SQL>
Прежде чем создавать связь между базами данных,нужно убедиться, что соединение с базой данных prod1 установлено, например, с использованием файла tnsnames.ora.Теперь можно выполнить процедуру GET_FILE для передачи файла с удаленного сервера на локальный, как показано ниже:
SQL> BEGIN DBMS_FILE_TRANSFER.GET_FILE( source_directory_object => 'SOURCE_DIR', source_file_name => 'test01.dbf', source_database => 'remote_db', destination_directory_object => 'DEST_DIR', destination_file_name => 'test01.dbf'); END; / SQL>
Обратите внимание, что в атрибуте SOURCE_DATABASE указывается имя связи с удаленной базой данных.
PUT_FILE
Процедура PUT_FILE служит для передачи двоичного файла с локального сервера на удаленный. Как и в случае с предыдущими двумя процедурами, сначала необходимо создать объекты исходного и целевого каталога, как показано ниже (вдобавок следует удостовериться в существовании связи между локальной и удаленной базами данных):
SQL> CONNECT system/system_passwd@remote_db Connected. SQL> CREATE OR REPLACE DIRECTORY source_dir as '/u01/app/oracle/source'; SQL> connect system/system_passwd@local_db Connected. SQL> CREATE OR REPLACE DIRECTORY dest_dir as /'u01/app/oracle/dest';
После этого можно использовать процедуру PUT_FILE для помещения локального файла на удаленный сервер:
SQL> BEGIN DBMS_FILE_TRANSFER.PUT_FILE( source_directory_object => 'SOURCE_DIR', source_file_name => 'test01.dbf', destination_directory_object => 'DEST_DIR', destination_file_name => 'test01.dbf', destination_database => 'remote_db'); END; / SQL>