Как использовать команду COPY table СУБД Oracle с использованием JDBC?

Я пытаюсь скопировать таблицу из одной базы данных в другую (на разных машинах) и использую шаблон JDBC для выполнения запроса, но этот запрос специфичен для Oracle:

COPY FROM username1/passwd1@//192.168.3.17:1521/PROD_SERVICE to username2/passwd2@//192.168.4.17:1521/SANDBOX_SERVICE INSERT TABLE_C (*) USING (SELECT * FROM TABLE_C);

И я получаю ошибку:

Вызвано: java.sql.SQLSyntaxErrorException: ORA-00900: недопустимый оператор SQL

Как я могу использовать синтаксис, специфичный для Oracle, в JDBC?


person kaylil_01    schedule 18.07.2020    source источник


Ответы (1)


Как уже пояснялось в некоторых комментариях, COPY - это команда sqlplus, и она уже давно устарела. Вы не можете использовать ее внутри JAVA, потому что эта команда не является частью механизма SQL, это просто дополнительная функция, доступная только в sqlplus. Он по-прежнему доступен, но только для обратной совместимости.

Если вы хотите скопировать таблицу с помощью Java, вам нужно сначала понять некоторые вещи:

  • Java или любой внешний движок, если на то пошло, не могут одновременно подключаться к обеим базам данных. Либо он подключается к одному, либо к другому.
  • Вам необходимо установить своего рода мост между обеими базами данных, чтобы ваша программа на Java действовала только как триггер.
  • Копирование таблиц между базами данных связано с базой данных, поэтому вам следует подумать об использовании инструментов, предоставляемых ядром вашей базы данных. У вас есть несколько вариантов, например Datapump или RMAN, хотя я считаю, что Datapump лучше всего подходит для вашего сценария.

Однако, если вы настаиваете на использовании Java, сначала вам необходимо установить связь с базой данных между обеими базами данных. Затем вы можете использовать Java для вызова вставки из одной базы данных в другую.

https://docs.oracle.com/database/121/SQLRF/statements_5006.htm#SQLRF01205

Если вы не хотите зависеть от записей thsnames на сервере, вот пример ссылок на базу данных:

CREATE DATABASE LINK to_my_remote_user 
   CONNECT TO remote_user IDENTIFIED BY password
   USING '(DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=remote_server)(PORT=remote_port))
            (CONNECT_DATA=(SERVICE_NAME=remote_service_name))
          )';

После того, как вы создали dblink, вы можете подключиться из java к базе данных, где доступна ссылка, и скопировать данные в удаленную базу данных.

INSERT INTO remote_user.remote_table@to_my_remote_user 
select * from local_user.local_table ;

Важно: обычно dblinks не разрешены в производственных системах, поскольку они повышают риски безопасности. Также помните, что операции DDL по ссылке на базу данных требуют дополнительного шага, например использования процедуры DBMS_UTILITY.EXEC_DDL_STATEMENT@dblink('create table ...);

Другой вариант за пределами Java - использовать функцию копирования SQL Developer. Хотя рекомендую только для маленьких столиков. Если вы хотите использовать его с большими таблицами, он, вероятно, зависнет. Вы можете прочитать здесь хороший пример:

копировать из одной базы данных в другую с помощью Oracle sql developer - сбой подключения

person Roberto Hernandez    schedule 19.07.2020