Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle :exportez une table avec des blobs vers un fichier .sql qui peut être réimporté

Je ne pense pas que ce soit possible avec SQL Developer (mais je ne l'utilise pas très souvent).

Le client SQL que j'utilise - SQL Workbench/J - peut le faire.

Il existe plusieurs façons d'exporter ces données.

Générer un script propriétaire

Il peut créer un script SQL qui utilise une notation spéciale (spécifique à l'outil) pour référencer un fichier externe, quelque chose comme :

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

L'instruction ci-dessus ne peut être exécutée à nouveau qu'avec SQL Workbench. Il n'est compatible avec aucun autre client SQL.

Utilisez utl_raw

Une autre alternative consiste à utiliser un "littéral blob", mais en raison de la limite d'Oracle sur 4000 octets pour un littéral de caractère, cela ne fonctionne que pour vraiment petites valeurs blob :

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

où le caractère littéral pour le cast_to_raw call contiendrait les valeurs hexadécimales du BLOB. Comme cela nécessite 2 caractères par "octet de blob", vous ne pouvez pas gérer les BLOB de plus de 2000 octets avec cela. Mais cette syntaxe fonctionnerait pour presque tous les outils Oracle SQL (s'ils peuvent gérer des scripts avec de très longues lignes).

Fichier d'entrée SQL*Loader

La troisième alternative consiste à exporter les données dans un fichier texte qui peut être importé à l'aide de SQL*Loader :

Le fichier texte contiendrait quelque chose comme ceci :

NAME    DATA
foobar  blob_r1_c2.data

Avec le fichier de contrôle SQL*Loader suivant :

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
)

Cela peut être chargé à l'aide de SQL*Loader et n'a donc pas besoin de SQL Workbench pour importer les données.

Plus de détails dans le manuel

Modifier

Comme Alex l'a souligné dans son commentaire, vous pouvez également utiliser une exportation DataPump - mais cela nécessite que vous ayez accès au système de fichiers sur le serveur. Les solutions ci-dessus stockent toutes les données sur le client.