SQL Plus: Создание и выполнение сценариев - Копирование данных из одной базы данных в другую

ОГЛАВЛЕНИЕ

Копирование данных из одной базы данных в другую

Утилита SQL*Plus предлагает собственные средства копирования данных из одной базы данных в другую и из одной таблицы в другую. Для этого используется команда COPY, которая позволяет:

  • копировать данные с удаленной базы данных в текущую;
  • копировать данные из текущей базы данных на удаленную;
  • копировать данные из одной удаленной базы данных в другую.
Примечание
В общем случае, предполагалось копирование данных между базой данных Oracle и базой данных другого производителя. В среде Oracle для копирования данных можно использовать SQL-операторы (CREATE TABLE AS и INSERT).

Команда COPY имеет следующий синтаксис:

<команда COPY> ::=
COPY <направление копирования> <действие копирования>
   <имя целевой таблицы> [(<имя столбца>{, <имя столбца>})] USING <запрос>
<направление копирования> ::=
FROM <база данных>
  / TO <база данных>
  / FROM <база данных> TO <база данных>
<база данных> ::=
<имя пользователя>[/<пароль>]@<строка связи>
<действие копирования> ::=
APPEND / CREATE / INSERT / REPLACE

Она копирует данные, возвращаемые запросом, в таблицу в локальной или удаленной базе данных. Поддерживаются только базовые типы данных (CHAR, DATE, LONG, NUMBER, VARCHAR2) и в будущих версиях (после 9.0.1) поддержка этой команды не гарантируется.

Если в конструкции <база данных> пароль не указан, SQL*Plus запросит его перед выполнением команды.

Действия копирования описаны в табл. 12.

Таблица 12. Действия копирования команды COPY.

Действие  Описание 
APPEND  Вставляет возвращенные запросом строки в целевую таблицу, если она существует. Если же таблица не существует, она создается.
CREATE  Вставляет возвращенные запросом строки в целевую таблицу, предварительно создавая ее. Если же таблица уже существует, возвращается сообщение об ошибке.
INSERT  Вставляет возвращенные запросом строки в целевую таблицу. Если таблица не существует, возвращается сообщение об ошибке. В список выбора запроса должно входить по одному столбцу для каждого столбца целевой таблицы.
REPLACE  Заменяет целевую таблицу и ее содержимое строками, возвращенными запросом. Если целевая таблица не существует, она создается. В противном случае, существующая таблица удаляется и вместо нее создается новая, содержащая скопированные данные.

Копировать данные можно не во все столбцы (тогда они должны быть совместимы по количеству и типам со списком выбора запроса), а только в указанные по именам. Если имя столбца содержит символы нижнего регистра или пробелы, его необходимо брать в двойные кавычки. Если список столбцов не задан, а целевую таблицу необходимо создавать, то их имена и типы будут такими же, как и в исходных таблицах.

По умолчанию, утилита SQL*Plus выполняет фиксацию транзакции после успешного завершения команды COPY. Если выполнить команду SET COPYCOMMIT n, где n - положительное целое число, фиксация будет выполняться после каждого n-го пакета записей. Размер пакета задается с помощью команды SET ARRAYSIZE.

Вся команда COPY должна поместиться на одной строке. Если необходимо перенести команду на следующую строку в конце строки необходимо ввести дефис (-).

Рассмотрим простой пример копирования таблицы:

SQL> copy from scott/tiger@training -
> create emp10 -
> using select * from emp where deptno = 10;

Размер массива выборки/привязки равен 15. (arraysize равен 15)
Фиксация по завершении. (copycommit равен 0)
Максимальная длина равна 80. (long равна 80)
Таблица EMP10 создана.

   3 строк выбрано из scott@training.
   3 строк вставлено в EMP10.
   3 строк зафиксировано в EMP10 по соединению DEFAULT HOST.

SQL> set linesize 100
SQL> select * from emp10;

     EMPNO ENAME  JOB           MGR HIREDATE        SAL   COMM  DEPTNO
---------- ------ --------- ------- -------- ---------- ------  ------
      7782 CLARK  MANAGER      7839 09.06.81       2450             10
      7839 KING   PRESIDENT         17.11.81       5000             10
      7934 MILLER CLERK        7782 23.01.82       1300             10