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

Oracle Discussion :

LONG RAW vers CHAR


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Par défaut LONG RAW vers CHAR
    Bonjour,

    je confronté au problème suivant :
    je suis en 'read only' d'une base oracle 9
    dans une table, il y a un champ (colonne) dont le format est LONG RAW
    Je suis certain que ce champ contient des caractères (pas d'images etc).
    Ma question :
    comment faire pour convertir ce champ vers un champ de caractères sachant aussi que seuls les 128 premiers caractères m'intéressent.

    Les programmes que j'utilise :
    Winsql
    QueryReporter

    Merci d'avance de votre aide et des pistes possibles.
    Morti

  2. #2
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Je ne comprends pas bien votre question...

    D'un côté, vous dites n'avoir un accès qu'en lecture seule sur la base, de l'autre, vous dites vouloir modifier la base....

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Par défaut
    >Merci de la réaction, voici quelques précisions :
    - je travaille en read only, cad que je peux accéder en lecture à toutes les tables de la base (mais pas INSERT UPDATE DELETE CREATE etc)
    - l'idée n'est pas de convertir une table, mais bien de 'transformer' un champ dans un autre format (comme on peut le faire par exemple avec to_char) pour pouvoir l'obtenir dans un état (ecran, listing, export)
    - le contexte est le suivant : ce champ contient le résultat d'une série de vérifications. Ce résultat est formatté et contient les données variables des contrôles effectués. Je voudrais produire une liste reprenant ces résultats en mode 'caractère' afin de pouvoir effectuer des filtres et rangements de ces résultats (regroupement par catégorie, par type d'erreur, en fonction des valeurs que l'on y retrouve, etc).
    - mon idée (mais elle estpeut être pas géniale) est d'exporter ce machin vers excel (c'est pourquoi j'utilise queryreporter) pour y faire des manipulations pour arriver a des tables pivot.
    En résumé :
    comment faire
    SELECT
    controles_erreurs.resultat
    controles_erreurs.dossier
    controles_erreurs.u_date
    FROM
    controles_erreurs
    WHERE
    u_date > SYSDATEetc
    où controles_erreurs est la table qui contient la date du contrôle, la référence du dossier, une chaine de caractères décrivant l'anomalie (qui est du format LONG RAW)

    Merci d'avance du suivi.
    Michel alias Morti.

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Essayez SUBSTR( colonne_long_raw, 1, 128 ), vous verrez bien...

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Par défaut
    j'ai essayé, voici le message que je reçois en retour :
    ORA-00932:types de données incohérentes : NUMBER attendu ; BINARY obtenu
    morti
    pas voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select
     sel_number, error_code, visit_id, SUBSTR(error_list, 1, 128 ) 
    from 
     adt.fac_error 
    where
     u_datim > '03-dec-2005'

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Je peux affecter le contenu d'une colonne LONG RAW a un varchar

    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
    CREATE TABLE test_longraw ( num NUMBER(3), lr LONG RAW )
    /
     
    INSERT INTO test_longraw VALUES (1, RAWTOHEX('coucou'))
    /
     
    SQL> DECLARE
      2    ch VARCHAR2(1000);
      3  BEGIN
      4    SELECT lr INTO ch FROM test_longraw WHERE num = 1 ;
      5    dbms_output.put_line( ch ) ;
      6  END;
      7  /
    636F75636F75
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>
    Maintenant, le résulat est stocké en héxa.
    Pour décoder, il faut boucler sur les paires de caractères....

    Donc voici une fonction qui converti un HEX en décimal
    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
    CREATE OR REPLACE FUNCTION Hex_To_Dec ( pc$hex IN VARCHAR2 )
    RETURN PLS_INTEGER
    IS
      hexch  VARCHAR2(40) := UPPER( pc$hex) ;
      len PLS_INTEGER := LENGTH( hexch) ;
      res PLS_INTEGER := 0 ;
      pos PLS_INTEGER := 0 ;
      val PLS_INTEGER ;
      car VARCHAR2(1) ;
    BEGIN
     
      FOR i IN REVERSE 1..len LOOP
     
        car := SUBSTR( hexch, i , 1 ) ;
     
    	IF ASCII(car) > 57 THEN
           val := ASCII(car) - 55 ;
        ELSE
           val := ASCII(car) - 48 ;
        END IF ;
     
        res := res + (val * ( POWER(16,pos) ) ) ;
     
    	pos := pos + 1 ;
     
      END LOOP ;
     
      RETURN( res ) ;
     
    END;
    /
    Que je peux utiliser de la sorte

    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
    SQL> DECLARE
      2    LC$hex  VARCHAR2(4000) ;
      3    res     VARCHAR2(4000) ;
      4    j       PLS_INTEGER := 1 ;
      5    car     VARCHAR2(2) ;
      6  BEGIN
      7    SELECT lr
      8    INTO   LC$Hex
      9    FROM   TEST_LONGRAW
     10    WHERE  NUM = 1 ;
     11    
     12    FOR i IN 1 .. LENGTH( LC$hex ) / 2 LOOP
     13      car := SUBSTR( lc$hex, j, 2 ) ;
     14      res :=res || CHR(Hex_To_Dec(car)) ;
     15      j := j + 2 ;
     16    END LOOP ;
     17    dbms_output.put_line( res ) ;
     18    
     19  END ;  
     20  /
    coucou
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>
    C'est bien évidament super tiré par les cheveux, et si quelqu'un à mieux, je prends !

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Par défaut
    heu, j'ai pas pl/sql, juste winsql et queryreporter.
    comment faire avec un de cs deux là ?
    alternative : comment installer un machin pl/sql (simple) ?
    merci
    morti

  8. #8
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Si vous vous connectez à une base Oracle, vous avez peut-être Sql*Plus ?

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Par défaut
    Bonjoour,
    mon probleme est resolu.
    Voici comment :
    1. un informaticien à qui j'ai passé les infos d'ici a fait une procedure avec le code donne ci-dessus.
    2. cette procédure, je l'appelle via un call
    3. ce qu'elle fait : sur base de valeur de champ fournies, une table (appelons la 'temporaire') est alimentee avec le contenu de la table d'origine ET la traduction en caractères du champ long raw
    4. ensuite, je consulte cette table normalement.
    Cela répond tout a fait a mon besoin immédiat.

    Merci en tout cas por votre aise (indispensable).

    Mortimer

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/05/2007, 21h36
  2. De int et long vers char*
    Par olivier857 dans le forum C++
    Réponses: 27
    Dernier message: 23/06/2006, 16h23
  3. Delphi + Conversion Oracle vers Access + LONG RAW
    Par jleg dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/03/2006, 09h35
  4. [9.2] Champ long raw vers fichier
    Par Noun dans le forum Oracle
    Réponses: 4
    Dernier message: 23/11/2005, 16h57
  5. DATABASE LINK + type Long et long raw ...
    Par bchristo dans le forum Administration
    Réponses: 21
    Dernier message: 26/04/2004, 15h27

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