Как да използвам команда COPY table на Oracle DBMS с помощта на 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

Ако не искате да зависи от thnames записи в сървъра, ето пример за връзки към бази данни:

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 разработчик - свързването е неуспешно

person Roberto Hernandez    schedule 19.07.2020