Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle:esporta una tabella con BLOB in un file .sql che può essere nuovamente importato

Non credo che questo sia possibile con SQL Developer (ma poi non lo uso molto spesso).

Il client SQL che sto usando - SQL Workbench/J - può farlo.

Esistono diversi modi per esportare questi dati.

Genera uno script proprietario

Può creare uno script SQL che utilizza una notazione speciale (specifica dello strumento) per fare riferimento a un file esterno, qualcosa come:

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

L'istruzione precedente può essere eseguita nuovamente solo con SQL Workbench. Non è compatibile con nessun altro client SQL.

Usa utl_raw

Un'altra alternativa consiste nell'usare un "blob literal", ma a causa del limite di Oracle su 4000 byte per un carattere letterale, questo funziona solo per davvero piccoli valori BLOB:

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

dove il carattere letterale per cast_to_raw call conterrebbe i valori esadecimali del BLOB. Poiché ciò richiede 2 caratteri per "byte blob", non puoi gestire BLOB più grandi di 2000 byte con quello. Ma quella sintassi funzionerebbe per quasi tutti gli strumenti Oracle SQL (se sono in grado di gestire script con righe molto lunghe).

File di input SQL*Loader

La terza alternativa è esportare i dati in un file di testo che può essere importato utilizzando SQL*Loader:

Il file di testo conterrebbe qualcosa del genere:

NAME    DATA
foobar  blob_r1_c2.data

Insieme al seguente file di controllo 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
)

Questo può essere caricato utilizzando SQL*Loader e quindi non ha bisogno di SQL Workbench per importare i dati.

Maggiori dettagli sono nel manuale

Modifica

Come ha sottolineato Alex nel suo commento, puoi anche utilizzare un'esportazione DataPump, ma ciò richiede che tu abbia accesso al file system sul server. Tutte le soluzioni di cui sopra memorizzano i dati sul client.