2011-05-16 150 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

相关问题