Java 如何使用JDBC使用Oracle DBMS的COPY table命令?
我正在尝试将表从一个数据库复制到另一个数据库(在不同的机器上),并使用JDBC模板执行查询,但此请求特定于Oracle:Java 如何使用JDBC使用Oracle DBMS的COPY table命令?,java,spring,oracle,jdbc,jdbctemplate,Java,Spring,Oracle,Jdbc,Jdbctemplate,我正在尝试将表从一个数据库复制到另一个数据库(在不同的机器上),并使用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
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的语法?正如一些评论已经阐明的那样,COPY是一个sqlplus命令,它已经被弃用了一段时间。您不能在JAVA内部使用它,因为该命令不是SQL引擎的一部分,它只是一种仅在sqlplus中可用的附加功能。它仍然可用,但仅用于向后兼容 如果要使用Java复制表,首先需要了解以下几点:
- Java或任何外部引擎都不能同时连接到两个数据库。它要么连接到一个,要么连接到另一个
- 您需要在两个数据库之间建立一种桥梁,以便您的Java程序只充当触发器
- 在数据库之间复制表与数据库有关,因此您应该考虑使用数据库引擎提供的工具。您有一些选项,如DATAPUMP或RMAN,虽然我认为DATAPUMP最适合您的方案。
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 ;
重要信息:通常生产系统上不允许使用数据库链接,因为它们会增加安全风险。还要记住,通过数据库链接执行DDL操作需要额外的步骤,例如使用过程DBMS\u UTILITY.EXEC\u DDL_STATEMENT@dblink('创建表…)代码>
Java之外的另一个选项是使用SQLDeveloperCopy特性。虽然我只推荐小桌子。如果你想在大桌子上使用它,它可能会挂起来。这里有一个很好的例子:
正如一些评论已经澄清的那样,COPY是一个sqlplus命令,它已经被弃用了一段时间。您不能在JAVA内部使用它,因为该命令不是SQL引擎的一部分,它只是一种仅在sqlplus中可用的附加功能。它仍然可用,但仅用于向后兼容
如果要使用Java复制表,首先需要了解以下几点:
- Java或任何外部引擎都不能同时连接到两个数据库。它要么连接到一个,要么连接到另一个
- 您需要在两个数据库之间建立一种桥梁,以便您的Java程序只充当触发器
- 在数据库之间复制表与数据库有关,因此您应该考虑使用数据库引擎提供的工具。您有一些选项,如DATAPUMP或RMAN,虽然我认为DATAPUMP最适合您的方案。
但是,如果坚持使用Java,首先需要在两个数据库之间建立数据库链接。然后可以使用Java调用从一个数据库到另一个数据库的插入
如果您不想依赖服务器中的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 ;
重要信息:通常生产系统上不允许使用数据库链接,因为它们会增加安全风险。还要记住,通过数据库链接执行DDL操作需要额外的步骤,例如使用过程DBMS\u UTILITY.EXEC\u DDL_STATEMENT@dblink('创建表…)代码>
Java之外的另一个选项是使用SQLDeveloperCopy特性。虽然我只推荐小桌子。如果你想在大桌子上使用它,它可能会挂起来。这里有一个很好的例子:
如果您是指,它从2001年左右就被弃用了,并且不支持自1998年以来添加的任何新功能。您需要以某种方式调用SQL*Plus才能使用它-它不是Oracle SQL的一部分。@WilliamRobertson Oracle是否有复制我可以在JDBC中使用的表的命令?您不能这样做吗,“将表xyz创建为select*from?您为什么不能使用RMAN(或expdp
或exp
)要创建该表的备份,然后从另一台计算机上的备份进行还原?@OldProgrammer,因为我需要将该表复制到另一台计算机上。如果您是指,它从2001年左右开始就被弃用,并且不支持自1998年以来添加的任何新功能。您需要以某种方式调用SQL*Plus才能使用它-它不是Oracle SQL的一部分。@WilliamRobertson Oracle是否有命令来复制我可以在JDBC中使用的表?您不能这样做吗,“创建表xyz作为select*from?为什么不能使用RMAN(或expdp
或exp
)来创建表的备份,然后从另一台机器上的备份还原?@OldProgrammer,因为我需要将表复制到另一台机器上。