【问题标题】:Oracle DBMS package command to export table content as INSERT statementOracle DBMS 打包命令将表内容导出为 INSERT 语句
【发布时间】:2012-01-11 12:51:00
【问题描述】:

有没有类似DBMS_METADATA.GET_DDL的子程序可以真正将表数据导出为INSERT语句?

例如,使用 DBMS_METADATA.GET_DDL('TABLE', 'MYTABLE', 'MYOWNER') 将导出 MYOWNER.MYTABLE 的 CREATE TABLE 脚本。有什么东西可以从 MYOWNER.MYTABLE 生成所有数据作为INSERT 语句?

我知道,例如 TOAD Oracle 或 SQL Developer 可以非常快地导出为 INSERT 语句,但我需要一种更加编程的方式来执行此操作。我也无法在我正在工作的数据库中创建任何过程或函数。

谢谢。

【问题讨论】:

  • 您找到解决方案了吗?

标签: oracle insert package database


【解决方案1】:

据我所知,没有 Oracle 提供的软件包可以做到这一点。我会怀疑任何声称可以实现这一目标的第三方工具,因为这基本上是不可能的。

我曾经写过一个这样的包,很快就后悔了。获得 99% 的时间都有效的东西很容易,但最后 1% 会杀死你。

如果你真的需要这样的东西,并且需要它非常准确,你必须严格控制允许哪些数据以及可以使用哪些工具来运行脚本。以下是您将面临的一小部分问题:

  • 转义
  • 单次插入非常慢(尤其是通过网络时)
  • 合并插入更快,但在开始插入数百行时可能会遇到一些令人讨厌的解析错误
  • 有许多潜在的数据类型,包括自定义数据类型。您现在可能只有 NUMBER、VARCHAR2 和 DATE,但如果有人添加 RAW、BLOB、BFILE、嵌套表等会怎样?
  • 由于 VARCHAR2 大小限制(4000 或 32767,取决于您的操作方式),存储 LOB 需要将数据分成块。
  • 字符集问题 - 这会让你 ¿¿¿¿¿¿¿ 发疯。
  • 环境限制 - 例如,SQL*Plus 不允许每行超过 2500 个字符,并且会在行尾删除空格。
  • 引用完整性 - 您需要禁用这些约束或以正确的顺序插入数据。
  • “假”列 - 虚拟列、XML lob 等 - 不要导入这些。
  • 缺少分区 - 如果您没有使用 INTERVAL 分区,您可能需要手动创建它们。
  • 更新的数据 - 几乎可以违反任何约束,因此您可能需要禁用所有内容。

如果您希望数据准确,您只需使用 Oracle 实用程序,例如数据泵和导出。

【讨论】:

    【解决方案2】:

    为什么不使用常规导出?
    如果必须,您可以生成导出脚本:

    让我们假设一个表 myTable(Name VARCHAR(30), AGE Number, Address VARCHAR(60))。

    select 'INSERT INTO myTable values(''' || Name || ','|| AGE ||',''' || Address ||''');' from myTable

    【讨论】:

      【解决方案3】:

      Oracle SQL Developer 通过它的导出功能做到了这一点。 DDL 以及数据本身。 对于大表可能有点不方便,并且可能会导致上述案例出现问题,但在 99% 的情况下都能正常工作。

      【讨论】:

        猜你喜欢
        • 2016-11-30
        • 2011-05-04
        • 2012-06-05
        • 1970-01-01
        • 2015-04-03
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多