3

我们需要在两个 Oracle 数据库模式之间复制记录。

手动,我们可以使用 SQL*PLUS COPY 命令执行此操作:

http://www.oracleutilities.com/SQLPLus/copy.html

但是,如果可能,我们希望使用 cx_Oracle 自动执行此操作(我们还需要做一些其他事情 - 例如 SSH 交互,因此使用 Python 和 cx_Oracle)。

但是,如果我尝试在 cx_Oracle 中执行 COPY,它似乎不喜欢该命令:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cx_Oracle.DatabaseError: ORA-00900: invalid SQL statement

我猜这是因为 COPY 是 SQL*PLUS 特定命令,而不是标准 SQL 规范的一部分?

无论如何,有没有办法让 COPY 命令(或任何其他 SQL*PLUS 特定扩展)在 cx_Oracle 下工作?

我相信可以使用 INSERT INTO...SELECT 来实现类似的效果,但是如果有问题的两个数据库位于不同的 Oracle 实例或主机上,则需要一个数据库链接,并且我们并不总是有权创建这些链接。

干杯,维克多

4

2 回答 2

0

实用程序run_all_sql_dir.py执行指定目录中的所有 sql 文件并创建一个日志文件。实用程序从一组 sql 文件生成脚本并sqlplus用于执行。在脚本中,您可以配置NLS变量:

NLS_DATE_FORMAT = "\'DD.MM.YYYY HH24:MI:SS\'"
NLS_NUMERIC_CHARACTERS = "\'.,\'"
NLS_LANG = 'AMERICAN_AMERICA.CL8MSWIN1251'

, 自动提交,

AUTO_COMMIT = "OFF"

, 静默 sqlplus

# silent sqlplus = "-s"  silent off sqlplus = ""
silent_sqlplus = "-s"

出错时停止脚本或继续执行

WHENEVER = 'WHENEVER SQLERROR EXIT SQL.SQLCODE'.

-u 指定用户名,例如 SCOTT

-p 指定密码,例如 TIGER

-c 指定连接字符串(TNS 别名)或简单连接字符串以连接到 oracle 数据库

-d 指定执行 sql 脚本的目录。

-l 指定输出日志的日志文件。

例如

run_all_sql_dir.py -u scott -p tiger -c 192.168.0.166:1521/test -d C:\Users\Dmitry\PycharmProjects\count_char\sql  -l log_sql.log
于 2020-11-18T03:50:08.040 回答
0

据我所知,您有两个选择:

  1. 使用 Popen 执行 SQL 文本/文件,如下所示: Not able to execute sql command through a session created using POPEN in python

  2. 打开两个会话,将数据放入列表/缓冲区并将其插入目标会话(使用绑定)。

于 2020-09-24T14:57:48.790 回答