2010-08-03 6 views
1

Voici le scénario:Oracle clob sur dblink avec différents charset

Oracle A: charset WE8ISO8859P1

Oracle B: charset WE8MSWIN1252

Oracle A < - dblink -> Oracle B

Je ne peux pas accéder à Oracle B directement, les problèmes de pare-feu :(

Je dois obtenir des fichiers binaires d'OracleB et ces fichiers sont dans une colonne de type CLOB (ne me demandez pas pourquoi et je ne peux pas changer en BLOB).

J'utilise un "select insert" pour obtenir les fichiers de B à A et les convertir en binaire en utilisant la fonction clob_to_blob trouvée here.

Je reçois des fichiers corrompus et je crois que c'est parce qu'Oracle convertit WE8MSWIN1252 en WE8ISO8859P1 automatiquement sur le dblink (bien, la colonne est CLOB donc c'est du texte, non?).

Je ne peux pas modifier les charsets des bases de données de quelque façon que ce soit.

Y a-t-il une solution de contournement pour cela?

Merci à l'avance

Répondre

1

Avez-vous essayé d'utiliser [email protected] (....)

Mais vous voulez probablement obtenir une sorte de contrôle de la CLOB à distance pour voir si elles obtiennent une conversion Caractéregroupe quand ils sont insérés/mis à jour à partir de n'importe quelle source externe originale. C'est-à-dire que si le jeu de caractères du client, lorsque l'insertion est terminée, est différent du jeu de caractères de la base de données, le problème peut déjà s'être produit avant de faire votre sélection.


Édité pour ajouter.

Le plus proche que je peux trouver nécessite des objets à l'autre bout du lien. Tout d'abord une fonction qui effectue la conversion à l'extrémité distante. Deuxièmement une vue qui présente une vue 'BLOB' des données. Ceci utilise une table fictive (basée sur v $ sql car c'était le premier CLOB que j'ai pu trouver). Aucune raison que je peux voir que vous ne pouvez pas simplement passer le CLOB comme un paramètre à la fonction.

create or replace function ret_blob return blob is 
    cursor c_1 is 
    select sql_fulltext, sql_id, length(sql_fulltext) 
    from v_sql 
    where sql_id = 'bzmb01whp36wt'; 
    rec_c1 c_1%rowtype; 
    -- 
    v_blob blob; 
    v_dest number := 1; 
    v_src number := 1; 
    v_lang number := 0; 
    v_warn number; 
    -- 
begin 
    open c_1; 
    fetch c_1 into rec_c1; 
    close c_1; 
    dbms_lob.createtemporary(v_blob, TRUE); 
    -- 
    dbms_lob.CONVERTTOBLOB (v_blob, rec_c1.sql_fulltext, DBMS_LOB.LOBMAXSIZE, 
     v_dest, v_src, DBMS_LOB.DEFAULT_CSID, v_lang, v_warn); 
    -- 
    dbms_output.put_line(':'||v_warn||'>'||length(v_blob)); 
    -- 
    return v_blob; 
end; 
/

create view rblob as select ret_blob from dual; 

Ensuite, à partir de la base de données locale, faire une

create table t as select ret_blob from [email protected] 
+0

Salut Gary, Non, si j'utilise la fonction de mon client (même avec @dblinkname) je reçois toujours un ORA-22992 :( Je pense que la seule chose que vous peut faire avec LOBS sur dblinks est un insert/select Les fichiers sont très bien sur le système distant :( Je déteste quand vous devez payer pour la mauvaise décision de quelqu'un d'autre dans le passé (fichiers binaires comme clobs ...) – andrecarlucci

+0

Enfin, j'ai réussi à obtenir une vue créée sur le côté distant.Cette vue convertit le clob en blob encore dans le côté distant et puis je peux utiliser insert/select de la base de données locale quand je veux.Tks pour l'idée de vue. – andrecarlucci

0

Ma meilleure suggestion serait de ne pas utiliser le lien DB mais faire ceci:

  1. Obtenez un programme client, soit autonome ou vos propres, pour extraire le CLOB d'Oracle B et écrivez les données sous la forme d'un fichier "texte" contenant les données binaires correctes.
  2. Importez ce fichier dans Oracle A en tant que fichier binaire dans le BLOB.
+0

Salut Dan, merci pour la réponse. Je ne peux pas accéder à B directement, les problèmes de pare-feu :( – andrecarlucci

0

Une alternative tout à fait différente. Créez la base de données C avec le même jeu de caractères que B. Tirez les données de B vers C (sans aucune conversion), puis vous pouvez faire des manipulations en C avant de déplacer les données vers A.