在cx_Oracle中使用SQL * PLUS COPY?

时间:2011-11-01 07:07:40

标签: python sql oracle sqlplus cx-oracle

我们需要在两个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实例或主机上,则需要数据库链接,而且我们并不总是有权创建这些链接。

干杯, 维克多

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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指定connect_string(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