2011-12-02 50 views
3

是否有任何类似于DBMS_METADATA.GET_DDL的子程序可以实际导出表数据为INSERT语句?Oracle DBMS包命令导出表内容为INSERT语句

例如,使用DBMS_METADATA.GET_DDL('TABLE', 'MYTABLE', 'MYOWNER')将导出MARKETER.MYTABLE的CREATE TABLE脚本。任何这样的东西来生成所有数据从MYOWNER.MYTABLE作为INSERT陈述?

我知道,例如TOAD Oracle或SQL Developer可以很快导出为INSERT语句,但我需要一个更具编程的方式来完成它。此外,我无法在我正在工作的数据库中创建任何程序或功能。

谢谢。

+1

您是否找到解决方案? –

回答

5

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

我曾经写过这样的软件包,很快就后悔了。 99%的时间很容易获得,但最后1%会杀死你。

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

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

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

0

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

让我们假设一个表mytable的(名称VARCHAR(30),年龄,地址VARCHAR(60))。

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

0

Oracle SQL Developer使用它来执行导出功能。 DDL以及数据本身。 对于巨大的表格可能有点不方便,并且可能会导致上述情况出现问题,但99%的时间很有效。