sql >> Base de Datos >  >> RDS >> Oracle

Oracle:exporte una tabla con blobs a un archivo .sql que se puede importar nuevamente

No creo que esto sea posible con SQL Developer (pero no lo uso muy a menudo).

El cliente SQL que estoy usando, SQL Workbench/J, puede hacer esto.

Hay varias formas de exportar estos datos.

Generar un script propietario

Puede crear un script SQL que use una notación especial (específica de la herramienta) para hacer referencia a un archivo externo, algo como:

INSERT INTO images
  (name, data)
VALUES
  ('foobar', {$blobfile='blob_r1_c2.data'});

La declaración anterior solo se puede ejecutar con SQL Workbench nuevamente. No es compatible con ningún otro cliente SQL.

Usar utl_raw

Otra alternativa es utilizar un "blob literal", pero debido al límite de Oracle de 4000 bytes para un carácter literal, esto solo funciona para realmente pequeños valores de blob:

INSERT INTO images
  (name, data)
VALUES
  ('foobar', to_blob(utl_raw.cast_to_raw('......')));

donde el carácter literal para cast_to_raw la llamada contendría los valores hexadecimales del BLOB. Como esto requiere 2 caracteres por "blob byte", no puede manejar BLOB de más de 2000 bytes con eso. Pero esa sintaxis funcionaría para casi todas las herramientas Oracle SQL (si pueden manejar scripts con líneas muy largas).

Archivo de entrada SQL*Loader

La tercera alternativa es exportar los datos a un archivo de texto que se puede importar usando SQL*Loader:

El archivo de texto contendría algo como esto:

NAME    DATA
foobar  blob_r1_c2.data

Junto con el siguiente archivo de control de SQL*Loader:

OPTIONS (skip=1)
LOAD DATA CHARACTERSET 'WE8ISO8859P15'
INFILE 'images.txt'
APPEND
INTO TABLE IMAGES
FIELDS TERMINATED BY '\t' TRAILING NULLCOLS
(
  NAME,
  lob_file_data FILLER,
  DATA LOBFILE(lob_file_data) TERMINATED BY EOF
)
>

Esto se puede cargar usando SQL*Loader y, por lo tanto, no necesita SQL Workbench para importar los datos.

Más detalles están en el manual

Editar

Como Alex ha señalado en su comentario, también puede usar una exportación de DataPump, pero eso requiere que tenga acceso al sistema de archivos en el servidor. Todas las soluciones anteriores almacenan los datos en el cliente.