在cx_Oracle中使用SQL*PLUS COPY?
我们需要在两个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实例或主机上,就需要一个数据库链接,而我们并不总是有权限去创建这些链接。
谢谢,
Victor
2 个回答
这个工具 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
从我的角度来看,你有两个选择:
使用Popen来执行SQL文本或文件,具体可以参考这里: 在Python中通过使用POPN创建的会话无法执行SQL命令
打开两个会话,把数据放到列表或缓冲区中,然后再插入到目标会话中(使用绑定)。