【问题标题】:How to use COPY table command of Oracle DBMS using JDBC?如何使用 JDBC 使用 Oracle DBMS 的 COPY table 命令?
【发布时间】:2020-11-08 07:06:46
【问题描述】:

我正在尝试将表从一个数据库复制到另一个数据库(在不同的机器上),并使用 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 语句

如何在 JDBC 中使用特定于 Oracle 的语法?

【问题讨论】:

  • 如果您的意思是SQL*Pus COPY command,它自 2001 年左右已被弃用,并且不支持自 1998 年以来添加的任何新功能。您需要以某种方式调用 SQL*Plus 才能使用它 - 它不是Oracle SQL 的一部分。
  • @WilliamRobertson Oracle 是否有命令复制我可以在 JDBC 中使用的表?
  • 你不能这样做,“创建表 xyz 作为 select * from
  • 为什么不能使用 RMAN(或expdpexp)创建表的备份,然后从另一台机器上的备份中恢复?
  • @OldProgrammer 因为我需要将表复制到另一台机器上。

标签: java spring oracle jdbc jdbctemplate


【解决方案1】:

就像一些 cmets 已经阐明的那样,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 ;

重要提示:通常在生产系统上不允许使用 dblink,因为它们会增加安全风险。还要记住,对数据库链接的 DDL 操作需要一个额外的步骤,例如使用过程 DBMS_UTILITY.EXEC_DDL_STATEMENT@dblink('create table ...);

Java 之外的另一个选项是使用 SQL Developer 复制功能。虽然我只推荐它用于小桌子。如果您想将它与大桌子一起使用,它可能会挂起。你可以在这里阅读一个很好的例子:

copy from one database to another using oracle sql developer - connection failed

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2016-08-06
    相关资源
    最近更新 更多