2011-05-16 29 views
6

Tenemos una tabla de producción que tiene millones de filas y contiene un campo BLOB, me gustaría copiar una selección más pequeña de estos registros en nuestra base de datos de desarrollo sin involucrar a un DBA si es posible. Probé el siguiente comando copia, pero recibí una CPY-0012: Datatype cannot be copied¿Hay alguna manera de copiar registros BLOB entre bases de datos en Oracle 10g?

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' 

¿Hay alguna forma de copiar los registros con un campo BLOB entre bases de datos a través de SQL?

Respuesta

7

Desafortunadamente no puede copiar los valores de BLOB usando el comando COPY.

Una alternativa es establecer un vínculo DB en la base de datos fuente, y ejecutar una instrucción 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

Gracias, eso es un fastidio. Debido a la auditoría interna, no estoy "autorizado" a crear un enlace de base de datos de una base de datos a otra, especialmente desde la producción a otra ubicación. Parece que necesito involucrar a un DBA pase lo que pase. – ProfessionalAmateur

4

Oracle's Data Pump (started 10g+) apoya el movimiento de datos BLOB.

+2

Data Pump aún requiere que se cree y especifique un enlace DB con el parámetro network_link si la copia debe realizarse entre servidores. – Datajam

+0

@Datajam Ltd: Sí, creo que el enlace proporcionado aborda eso: ¿cuál es su punto? –

1

Se me ocurrió una solución que me gusta, esta versión tiene una limitación de 4000 caracteres en el CLOB.

1) en la copia de base de datos:

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

2) a continuación, ejecutar el comando de copia

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) en la copia de base de datos:

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

4) a continuación, suelte la tabla tmp

He estado luchando con esta limitación, y esta solución me ha ayudado mucho.

+0

¿Alguna vez ha tenido escenarios en los que necesita más de 4000 caracteres? Me gusta esta idea, pero en mi caso el campo blob puede ser bastante grande. – ProfessionalAmateur

Cuestiones relacionadas