IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Conversion long binary to varchar [11g]


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut Conversion long binary to varchar
    Bonjour,

    Désolé si le post a déjà été fait mais après pas mal de recherches, je n'ai pu trouver réponse à ma question.
    J'ai une table contenant un champ de type "long raw" contenant le binaire d'un XML.

    J'aimerais pouvoir transcoder cela en varchar afin de pouvoir l’interroger mais impossible.
    Voici les requêtes que j'ai faite ainsi que les erreurs rapportées par chacune :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select CAST(fichier as nvarchar2(4000) ) from TB_MESSAGES_BIN where ID_MESSAGE = '1776041';
    L'erreur :
    ORA-00932: types de données incohérents ; attendu : CHAR ; obtenu : LONG BINARY
    00932. 00000 - "inconsistent datatypes: expected %s got %s"
    *Cause:
    *Action:
    Erreur à la ligne 10, colonne 13


    J'ai donc rajouté la fonction TO_LOB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select CAST(TO_LOB(fichier) as nvarchar2(4000) ) from TB_MESSAGES_BIN where ID_MESSAGE = '1776041';
    L'erreur
    ORA-00932: types de données incohérents ; attendu : - ; obtenu : LONG BINARY
    00932. 00000 - "inconsistent datatypes: expected %s got %s"
    *Cause:
    *Action:
    Erreur à la ligne 10, colonne 13


    J'ai mis juste la fonction TO_LOB et j'ai la même erreur que la précédente, c'est donc de là que vient le soucis.

    Si quelqu'un saurait m'aider

    Merci d'avance,

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Le sujet est compliqué, les types LONG et LONG RAW ne doivent plus être employés depuis qu'Oracle a sorti les types LOB.
    Quelle est la version de ta base?

    As-tu fait tes tests sans le CAST?

    Ici, on a un test pour gérer les CLOB et LONG RAW sans passer par CAST : https://community.oracle.com/thread/336220.
    Ici on parle d'un package utl_raw : http://www.orafaq.com/wiki/LONG_RAW

    Finalement, je pense que ici tu trouveras ton bonheur car le package utl_raw a énormément de fonctions de conversion : https://docs.oracle.com/cloud/latest...w.htm#ARPLS072
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Salut, et merci pour ta réponse.

    Voici les réponses à tes questions :

    Versions de la bdd : Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

    Oui, j'ai essayé sans le cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select TO_LOB(fichier) fromTB_MESSAGES_BIN where ID_MESSAGE = '1776041';
    Ce qui m'a donné l'erreur :
    ORA-00932: types de données incohérents ; attendu : - ; obtenu : LONG BINARY
    00932. 00000 - "inconsistent datatypes: expected %s got %s"
    *Cause:
    *Action:
    Erreur à la ligne 25, colonne 8



    J'ai commencé à regarder ton lien, j'ai fait ça pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select SYS.UTL_RAW.CAST_TO_VARCHAR2(fichier) from CORA_LOG.TB_MESSAGES_BIN where ID_MESSAGE = '1776041';
    Mais ça ne fonctionne pas pour le moment :
    ORA-00997: utilisation interdite du type de données LONG
    00997. 00000 - "illegal use of LONG datatype"
    *Cause:
    *Action:
    Erreur à la ligne 27, colonne 37

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Aïe, tu veux transcoder un LONG RAW en VARCHAR2 alors que util_raw ne permet que de transcoder du RAW vars VARCHAR2 si je comprends bien le message d'erreur...
    Bon, alors essaye de convertir un LONG RAW en RAW si c'est possible puis de convertir le RAW en VARCHAR2 avec util_raw

    Quelque chose me dit que ça va être pénible...


    Lien des règles de conversion Oracle 12, le LONG RAW n'est pas géré... https://docs.oracle.com/database/121...htm#SQLRF51037
    Es-tu sur que c'est bien du LONG RAW? On peut avoir un DESC de la table et la version d'Oracle?

    Dans ce lien Oracle 10 sur Java, le LONG RAW n'existe pas : https://docs.oracle.com/javadb/10.8....sqlj33562.html
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Extrêmement pénible oui, les larmes coulent à flots

    Je ne suis pas sûr que cela soit possible, de convertir du long raw en raw. En tout cas je n'ai rien vu en ce sens

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Je pense qu'il y a un pb avec ta colonne.
    On a le code erreur suivant : c'est bizarre que le type attendu ne soit pas mentionné alors qu'il est dans l'autre code erreur.
    "select CAST(TO_LOB(fichier) as nvarchar2(4000) ) from TB_MESSAGES_BIN where ID_MESSAGE = '1776041';
    ORA-00932: types de données incohérents ; attendu : - ; obtenu : LONG BINARY
    00932. 00000 - "inconsistent datatypes: expected %s got %s""

    "select CAST(fichier as nvarchar2(4000) ) from TB_MESSAGES_BIN where ID_MESSAGE = '1776041';
    ORA-00932: types de données incohérents ; attendu : CHAR ; obtenu : LONG BINARY
    00932. 00000 - "inconsistent datatypes: expected %s got %s""

    Tant qu'on a pas un DESC de la table, je pense qu'on tournera en rond.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Bon,

    Maintenant que je suis chauve car j'ai perdu tous mes cheveux, le pl/sql m'a finalement sauvé la vie. Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    declare 
    v_contenu_fichier_moche varchar2(32000);
    v_contenu_test varchar2(32000);
    v_blob blob;
    v_clob CLOB;
    v_varchar VARCHAR2(32767);
    v_start PLS_INTEGER := 1;
    v_buffer PLS_INTEGER := 32767;
    machin xmltype;
    Nomacte varchar2(50);
    DateActe varchar2(50);
    CodeAction varchar2(50);
     
    BEGIN
    DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
     
    select fichier into v_contenu_fichier_moche from TB_MESSAGES_BIN where ID_MESSAGE = '1780650';
    FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(v_contenu_fichier_moche) / v_buffer)
    LOOP
     v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(v_contenu_fichier_moche, v_buffer, v_start));
     
    DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
    v_start := v_start + v_buffer;
    END LOOP;
     
    DBMS_OUTPUT.put_line(v_clob);
    select XMLTYPE(v_clob) into machin from dual;
     
     
     
    end;

    Merci pour ton aide en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Linq To SQL] Conversion d'un binary en varchar
    Par TimTam dans le forum Linq
    Réponses: 0
    Dernier message: 18/09/2010, 11h26
  2. Conversion long -> byte[]
    Par nuriel2 dans le forum Général Java
    Réponses: 7
    Dernier message: 12/08/2010, 14h34
  3. Réponses: 1
    Dernier message: 13/02/2010, 13h44
  4. Conversion Long en int pas très propre !
    Par totoche dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 12/09/2008, 09h50
  5. Conversion Long en LCPSTR
    Par poseidon2 dans le forum MFC
    Réponses: 4
    Dernier message: 13/04/2005, 12h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo