Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JDBC使用Oracle DBMS的COPY table命令?_Java_Spring_Oracle_Jdbc_Jdbctemplate - Fatal编程技术网

Java 如何使用JDBC使用Oracle DBMS的COPY table命令?

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

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

正如一些评论已经阐明的那样,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特性。虽然我只推荐小桌子。如果你想在大桌子上使用它,它可能会挂起来。这里有一个很好的例子:


正如一些评论已经澄清的那样,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,因为我需要将表复制到另一台机器上。