Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle:exporte uma tabela com blobs para um arquivo .sql que pode ser importado novamente


Não acho que isso seja possível com o SQL Developer (mas não o uso com muita frequência).

O cliente SQL que estou usando - SQL Workbench/J - pode fazer isso.

Existem várias maneiras de exportar esses dados.

Gerar um script proprietário


Ele pode criar um script SQL que usa uma notação especial (específica da ferramenta) para referenciar um arquivo externo, algo como:
INSERT INTO images
  (name, data)
VALUES
  ('foobar', {$blobfile='blob_r1_c2.data'});

A instrução acima só pode ser executada novamente com o SQL Workbench. Não é compatível com nenhum outro cliente SQL.

Usar utl_raw


Outra alternativa é usar um "literal blob", mas devido ao limite do Oracle em 4000 bytes para um literal de caractere, isso só funciona para realmente valores de blob pequenos:
INSERT INTO images
  (name, data)
VALUES
  ('foobar', to_blob(utl_raw.cast_to_raw('......')));

onde o caractere literal para o cast_to_raw A chamada conteria os valores hexadecimais do BLOB. Como isso requer 2 caracteres por "blob byte", você não pode lidar com BLOBs maiores que 2000 bytes com isso. Mas essa sintaxe funcionaria para quase todas as ferramentas Oracle SQL (se puderem lidar com scripts com linhas muito longas).

Arquivo de entrada SQL*Loader


A terceira alternativa é exportar os dados para um arquivo de texto que pode ser importado usando o SQL*Loader:

O arquivo de texto conteria algo assim:
NAME    DATA
foobar  blob_r1_c2.data

Juntamente com o seguinte arquivo de controle 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
)

Isso pode ser carregado usando o SQL*Loader e, portanto, não precisa do SQL Workbench para importar os dados.

Mais detalhes estão no manual

Editar

Como Alex apontou em seu comentário, você também pode usar uma exportação DataPump - mas isso requer que você tenha acesso ao sistema de arquivos no servidor. Todas as soluções acima armazenam os dados no cliente.