我们需要在两个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实例或主机上,则需要数据库链接,而且我们并不总是有权创建这些链接。
干杯, 维克多
答案 0 :(得分:0)
据我所知,您有两种选择:
使用Popen执行SQL文本/文件,如下所示: Not able to execute sql command through a session created using POPEN in python
打开两个会话,将数据获取到列表/缓冲区,然后将其插入目标会话(使用绑定)。
答案 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