2010-08-30 13 views
0

Je dois migrer des données d'une base de données à une autre. Comme préparation, nous avons déjà extrait les données CLOB et BLOB dans des fichiers séparés situés sur le serveur Oracle. La base de données contient plusieurs colonnes CLOB et BLOB dans différentes tables qui ont été initialisées avec des valeurs NULL pour toutes ces lignes.Comment lire des fichiers dans des lignes LOB existantes dans Oracle?

Comment puis-je charger le contenu d'un fichier dans la colonne CLOB ou BLOB d'une ligne existante. Je connais les touppes exactes des clés d'identification primaires et des noms de fichiers ... mais je n'ai trouvé aucun moyen de lire ces fichiers dans les tables.

SQL Le chargeur par exemple semble uniquement pouvoir ajouter des lignes ou remplacer la table complète. Mais je veux seulement mettre à jour des colonnes simples. Nous pouvons utiliser SQL Loader si nécessaire ou plaine scripts PL/SQL - tout ce qui fonctionne.

Merci pour votre aide.

+0

Les deux bases de données Oracle? Si oui, pouvez-vous utiliser un lien de base de données ou exporter/importer une table au lieu d'utiliser des fichiers? –

+0

Non, nous parlons de différents systèmes qui ne peuvent pas être liés. Ils sont tous deux Oracle - mais pas connectés sur un réseau commun. –

Répondre

1

Le fait de procéder comme indiqué ci-dessous devrait faire l'affaire. Vous voudriez le paramétrer et faire une version séparée pour les données BLOB. Vous ne savez pas si vous avez des problèmes de jeu de caractères non plus.

declare 
    l_bfile bfile := bfilename('DATA_PUMP_DIR','cpy.log'); 
    l_data clob; 
    l_soffset NUMBER := 1; 
    l_doffset NUMBER := 1; 
    l_lang NUMBER := 0; 
    l_warn NUMBER; 
begin 
    DBMS_LOB.createtemporary (lob_loc => l_data,cache => TRUE, 
           dur => DBMS_LOB.call); 
    dbms_lob.fileopen(l_bfile, DBMS_LOB.file_readonly); 
    DBMS_LOB.loadclobfromfile(l_data, l_bfile, DBMS_LOB.LOBMAXSIZE, 
      l_soffset, l_doffset, 0, l_lang, l_warn ); 
    dbms_lob.fileclose(l_bfile); 
    update f_lob set value = l_data where id = 1; 
end; 
/
+0

Cela semble prometteur ... Je vais essayer aujourd'hui. –

+0

Merci, ça m'a aidé! Bien que je n'ai pas réussi à l'utiliser dans une boucle avec des noms de fichiers lus dynamiquement et d'autres paramètres ... mais j'ai simplement concaténé plus de 1000 de ces blocs et réussi à remplir les LOB pour l'instant. –