2011-05-16 145 views
6

我們有一個包含數百萬行的生產表,並且包含一個BLOB字段,我想將這些記錄的一小部分選擇複製到我們的開發數據庫中,如果可能的話,不會涉及DBA。我嘗試了以下COPY命令,但收到CPY-0012: Datatype cannot be copied有沒有辦法在Oracle 10g中的數據庫之間複製BLOB記錄?

COPY FROM user/[email protected]_db TO user/[email protected]_db - 
INSERT TABLE_A (COL1, COL2, COL3, BLOB_COL) USING - 
SELECT COL1, COL2, COL3, BLOB_COL - 
FROM TABLE_A WHERE COL1='KEY' 

有沒有辦法通過SQL數據庫之間的BLOB字段複製記錄?

回答

7

不幸的是,您不能使用COPY命令複製BLOB值。

另一種方法是建立在源數據庫上一個DB鏈接,並執行SQL INSERT語句:

CREATE DATABASE LINK link_to_prod CONNECT TO prod_user IDENTIFIED BY prod_password USING 'prod_db'; 

INSERT INTO [email protected]_to_prod (COL1, COL2, COL3, BLOB_COL) SELECT COL1, COL2, COL3, BLOB_COL FROM TABLE_A 
+1

謝謝,這是一個無賴。由於內部審計,我不'允許'創建從一個數據庫到另一個數據庫的數據庫鏈接,尤其是從生產到另一個位置。看起來我無論如何都需要涉及DBA。 – ProfessionalAmateur 2011-05-17 01:35:52

4

Oracle's Data Pump (started 10g+)支持移動BLOB數據。

+2

如果副本需要在服務器之間進行,則數據泵仍需要創建數據庫鏈路並使用network_link參數進行指定。 – Datajam 2011-05-16 23:02:47

+0

@Datajam有限公司:是的,我相信鏈接提供的地址 - 你有什麼意思? – 2011-05-16 23:26:05

1

我想出了一個我喜歡的解決方案 - 這個版本在CLOB上有4000個字符的限制。

上覆制到數據庫1):

create TABLE_A_TMP as 
select COL1, COL2, COL3, cast(BLOB_COL as varchar2(4000)) BLOB_COL 
from TABLE_A 
where 1=0; 

2)然後運行對複製的複製命令

COPY FROM user/[email protected]_db TO user/[email protected]_db - 
INSERT TABLE_A_TMP (COL1, COL2, COL3, BLOB_COL) USING - 
SELECT COL1, COL2, COL3, cast(BLOB_COL as varchar2(4000)) - 
FROM TABLE_A WHERE COL1='KEY' 

3)TO數據庫:

INSERT TABLE_A (COL1, COL2, COL3, BLOB_COL) 
SELECT COL1, COL2, COL3, BLOB_COL 
FROM TABLE_A_TMP 

4)然後刪除tmp表

我一直在努力解決這個限制,這個解決方案幫了我很大的忙。

+0

你有過場景,你需要超過4000個字符嗎?我喜歡這個想法,但在我的情況下,blob字段可能很大。 – ProfessionalAmateur 2012-06-07 14:29:27

相關問題