Oracle DBMS包命令将表内容导出为INSERT语句

res*_*a87 3 database oracle insert package

有没有类似的子程序DBMS_METADATA.GET_DDL可以实际导出表数据作为INSERT语句?

例如,using DBMS_METADATA.GET_DDL('TABLE', 'MYTABLE', 'MYOWNER')将导出CREATE TABLEMYOWNER.MYTABLE 的脚本.从MYOWNER.MYTABLE生成所有数据作为INSERT语句?

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

谢谢.

Jon*_*ler 5

据我所知,没有Oracle提供的包来做到这一点.而且我会对任何声称要实现这一目标的第三方工具持怀疑态度,因为它基本上是不可能的.

我曾经写过这样的包,很快就后悔了.很容易得到99%的时间都可以使用的东西,但最后1%会杀死你.

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

  • 逃离
  • 单个插入非常慢(特别是如果它通过网络)
  • 组合插入更快,但是当你开始插入数百行时,可能会遇到一些讨厌的解析错误
  • 有许多潜在的数据类型,包括自定义数据类型.您现在可能只有NUMBER,VARCHAR2和DATE,但如果有人添加了RAW,BLOB,BFILE,嵌套表等,会发生什么?
  • 存储LOB需要将数据分成块,因为VARCHAR2大小限制(4000或32767,具体取决于您的操作方式).
  • 字符集问题 - 这将驱动你¿¿¿¿¿¿¿疯狂.
  • 环境限制 - 例如,SQL*Plus每行不允许超过2500个字符,并且会在行尾添加空格.
  • 参照完整性 - 您需要禁用这些约束或以正确的顺序插入数据.
  • "假"列 - 虚拟列,XML lobs等 - 不要导入这些.
  • 缺少分区 - 如果您不使用INTERVAL分区,则可能需要手动创建它们.
  • Novlidated数据 - 几乎可以违反任何约束,因此您可能需要禁用所有内容.

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