【问题标题】:Import oracle dump file into Oracle using cx_Oracle使用 cx_Oracle 将 oracle 转储文件导入 Oracle
【发布时间】:2014-05-26 11:02:12
【问题描述】:

我正在尝试使用 cx_Oracle 将转储文件导入 Oracle。我能够按命令执行命令。任何人都可以建议如何做到这一点?

我目前正在使用:

imp servicely/tiger@ubuntu file=/home/hemalatha/hemalatha_data/test_data/oracle/schema_only.sql full=y. 

但是,我收到了错误:IMP-00037: Character set marker unknown

【问题讨论】:

  • 你不会;你会使用suprocess.call(['impdp', ..., ]) 因为impdp 是一个可执行文件。
  • 实际上,我给出了以下命令。 imp servicely/tiger@ubuntu file=/home/hemalatha/hemalatha_data/test_data/oracle/schema_only.sql full=y。但我得到“IMP-00037:字符集标记未知”
  • 这是命令行。这与 Python 无关。你是从 Python 调用这个吗?
  • 是的。我从 python 打电话。你能举个例子如何将oracle转储导入oracle,我收到错误“错误:IMP-00037:字符集标记未知”?

标签: python oracle oracle11g cx-oracle dmp


【解决方案1】:

我认为你对自己实际拥有的东西感到困惑。

你说

我可以通过命令执行命令

而且您假定的导入文件具有.sql 扩展名。我认为您有一个充满 SQL 语句的脚本。您没有导出文件,它是由expexpdp 生成的二进制文件。 impimpdp分别用于导入expexpdp生成的文件。如果你给他们一个 SQL 脚本来运行,他们会表现得一头雾水。

如果您要针对数据库运行 SQL 脚本,请使用 SQL*Plus。这是一个简单的 SQL*Plus 脚本,它并没有做太多的事情:

PROMPT Hello, we are in SQL*Plus

SELECT * FROM DUAL;

这是一个简单的 Python 脚本,用于在 SQL*Plus 中运行此脚本并显示输出:

import subprocess

script = subprocess.Popen(["sqlplus", "-L", "user/password", "@script.sql"],
                          stderr=subprocess.STDOUT, stdin=subprocess.PIPE,
                          stdout=subprocess.PIPE)
script.stdin.close()  # Force SQL*Plus to exit after reading script.
for line in script.stdout:
    print line.rstrip()

请注意,我们需要连接到 SQL*Plus 的输入并关闭它,否则 SQL*Plus 将不会退出并且脚本会挂起。

当我运行它时,我得到以下输出:

SQL*Plus: Release 11.2.0.2.0 Production on Mon May 26 14:22:34 2014

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

Hello, we are in SQL*Plus

D
-
X

SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

【讨论】:

  • 非常感谢。它对我有用。还有一个小疑问。我应该如何将 oracle 表导出为可读的 .sql 转储文件
  • @Hemalatha:许多 Oracle 工具,例如 SQL Developer、TOAD 或 PL/SQL Developer,都可以为您完成这项工作。 SQL Developer 是免费的,关于如何使用它导出数据的问题在这里:stackoverflow.com/questions/2552711/…
  • 对不起。我不想为我的项目使用这些工具,我需要将导出 oracle 转储的代码编写为 SQL 脚本。如果你知道答案,请告诉我?
  • @Hemalatha:在我看来,仅使用数据库是无法做到这一点的。我当然不会编写自己的代码来做到这一点。我会使用这些工具。我想可以自己编写代码来执行此操作,使用数据字典视图来找出表包含的列以及每列包含的数据类型。然而,这是一项艰巨的任务。请不要指望我在这里为你写。
猜你喜欢
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多