2011-12-02 47 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%的時間很有效。