首页 文章

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

提问于
浏览
3

是否有任何类似于 DBMS_METADATA.GET_DDL 的子程序可以将表数据实际导出为 INSERT 语句?

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

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

谢谢 .

3 回答

  • 0

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

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

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

    • 逃脱

    • 单个插入非常慢(特别是如果它通过网络)

    • 组合插入更快,但是当你开始插入数百行时,可能会遇到一些讨厌的解析错误

    • 有许多潜在的数据类型,包括自定义数据类型 . 您现在可能只有NUMBER,VARCHAR2和DATE,但如果有人添加了RAW,BLOB,BFILE,嵌套表等,会发生什么?

    • 存储LOB需要将数据分成块,因为VARCHAR2大小限制(4000或32767,具体取决于您的操作方式) .

    • 字符集问题 - 这将驱动你¿¿¿¿¿¿¿疯狂 .

    • 环境限制 - 例如,SQL * Plus每行不允许超过2500个字符,并且会在行尾添加空格 .

    • 参照完整性 - 您需要禁用这些约束或以正确的顺序插入数据 .

    • "Fake"列 - 虚拟列,XML lobs等 - 请勿导入这些列 .

    • 缺少分区 - 如果您没有使用INTERVAL分区,则可能需要手动创建它们 .

    • Novlidated数据 - 几乎可以违反任何约束,因此您可能需要禁用所有内容 .

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

  • 0

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

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

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

  • 5

    Oracle SQL Developer通过它的导出功能实现了这一点 . DDL以及数据本身 . 对于巨大的表格可能有点不方便,并且可能导致上述情况出现问题,但99%的情况下效果很好 .

相关问题