Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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
Python 使用SQL*PLUS从cx\U Oracle内部复制?_Python_Sql_Oracle_Sqlplus_Cx Oracle - Fatal编程技术网

Python 使用SQL*PLUS从cx\U Oracle内部复制?

Python 使用SQL*PLUS从cx\U Oracle内部复制?,python,sql,oracle,sqlplus,cx-oracle,Python,Sql,Oracle,Sqlplus,Cx Oracle,我们需要在两个Oracle数据库模式之间复制记录 我们可以使用SQL*PLUS COPY命令手动执行此操作: 但是,如果可能的话,我们希望使用cx_Oracle实现自动化(我们还需要做一些其他事情,例如SSH交互,因此需要使用Python和cx_Oracle) 但是,如果我尝试在cx_Oracle内部执行COPY,它似乎不喜欢以下命令: Traceback (most recent call last): File "<stdin>", line 1, in <modul

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

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

但是,如果可能的话,我们希望使用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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
cx_Oracle.DatabaseError:ORA-00900:无效的SQL语句
我猜这是因为COPY是一个SQL*PLUS特定命令,而不是标准SQL规范的一部分

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

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

干杯,
维克多

在我看来,你有两个选择:

  • 使用Popen执行SQL文本/文件,如下所示:

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

  • 该实用程序执行指定目录中的所有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为连接到oracle数据库指定connect_字符串(TNS别名)或easy connect字符串

    -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
    

    SQLPlus命令由SQLPlus解析和执行。因此,没有办法将它们与任何其他API一起使用。嗯,首先,换句话说,有没有办法实现与SQL*PLUS相同的功能(在不使用数据库链接的情况下跨数据库表记录复制?)将数据从数据库复制到Python,然后再复制回数据库将带来大量的网络流量。SQL*Plus COPY也是如此,所以请真正了解如何实现其他解决方案,如DB链接。如果您确实想使用Python,那么请确保检查并