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

PL/SQL Oracle Discussion :

[JSON/SQL] Extraction de données dans un champ au format JSON [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut [JSON/SQL] Extraction de données dans un champ au format JSON
    Bonjour,
    j'essaie de récupérer des données dans un champ stocké sous forme de NCLOB dans une base Oracle.

    Ce champ comporte des données pour 30 molécules.
    A l'intérieur de chaque molécule, 22 valeurs sont renseignées.

    Exemple sur une molécule :

    {
    '[{
    "molecule":{
    "tauxDepart":"0.77","ecoPotentielBoite":"1.65","tauxStabilite":"1","tauxArrive":"0.9108","codeStabilite":"331","denoTauxArrive":"269","numTauxArrive":"245","code":"1","seuilIntermediaire":"0.82","seuilBas":"0.57","numStabilite":"10000","codeTauxDepart":"231","flagConcerne":"true","flagTDM":"true","nomMolecule":"ALPRAZOLAM","denoStabilite":"10000","codeTauxArrive":"281","positionResteRep":"AVANT","ecoPotentielTotal":null,"tauxDepartMoyen":"0.77","tauxRealisation":"0.75222222220","respectTauxStabilite":"true","montant":"116.86"}
    }
    ]'}
    Je me suis installé la bibliothèque JSON/SQL trouvée sur http://sourceforge.net/projects/pljson/

    J'ai fait une fonction pour pouvoir récupérer la valeur d'un champ pour la 1ère molécule (dans un premier temps).
    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
     
    CREATE OR REPLACE FUNCTION PH_PARSE 
                (
                    MyStringIN NCLOB,
                    MyChamp VARCHAR2
                )
     
        RETURN VARCHAR2 IS
        MyStringOUT VARCHAR2(255);
     
        v_Tout json;
        v_Mols json;
        v_Molecule json;
     
        BEGIN
            v_Tout:=json(MyStringIN);
            v_Mols:=JSON_EXT.GET_JSON(v_Tout,'listeMolecules');
            v_Molecule:=JSON_EXT.GET_JSON(v_Mols,'molecule');
     
            MyStringOUT := JSON_EXT.GET_STRING(v_Molecule,MyChamp,1);
            RETURN MyStringOUT;
    END;
    /
    Je n'ai pas d'erreur à la compilation ni à l'exécution.

    Je n'arrive pas à récupérer la valeur de tauxDepart pour la1ère molécule avec l'appel suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT PH_PARSE(MyNCLOB,'tauxDepart') FROM DUAL;
    La fonction me renvoie une valeur NULL.

    Je n'y connais rien en javaScript, si quelqu'un a déjà extrait des données d'une chaîne de caractères représentant un enregistrement JSON avec Oracle, ça m'aiderait bien.

    Merci beaucoup.

    P.S.

    Sur un petit exemple, j'ai réussi à placer ma chaîne de caractères dans un objet json_list et à afficher toutes les données à l'écran.
    Mais je n'arrive pas à sélectionner un élément particulier de la liste (par exemple tauxDepart) pour le récupérer et le faire renvoyer par une fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set serveroutput on format wrapped;
    declare
      obj json_list;
    begin
      obj := json_list('[{"molecule":{"Nom":"Toto","tauxDepart":"0.77","ecoPotentielBoite":"1.65"}},{"molecule":{"Nom":"Titi","tauxDepart":"1.00","ecoPotentielBoite":"5.87"}}]');
      obj.path('[1][1]').print; -- fonctionne : 1ère molécule : Affiche à l'écran toutes Données de toto
      obj.path('[2][1]').print; -- fonctionne : 2nde molécule : Affiche à l'écran toutes Données de Titi
    end;
    /
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pour quelle version d'Oracle ? La 12c supporte nativement le JSon.

  3. #3
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Merci mnitu,
    je suis en 11g.

    Je viens de trouver la solution à mon problème :

    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
    CREATE OR REPLACE FUNCTION PH_PARSE 
                (
                    MyStringIN NCLOB,
                    MyEnr VARCHAR2,
                    MyChamp VARCHAR2
                )
     
        RETURN VARCHAR2 IS
     
        MyStringOUT NCLOB; 
        l_list json_list; -- Liste JSON
     
        BEGIN
            l_list := json_list(MyStringIN);
            MyStringOut:= l_list.path('['||MyEnr||'][1].'||MyChamp).to_char(); -- Convertit l'élément sélectionné de la liste json en varchar2 - MyEnr ième élément de la liste, Champ MyChamp
     
            RETURN TO_CHAR(MyStringOUT);
    END;
    /
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Super!

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

Discussions similaires

  1. Regroupement de données dans un champs SQL
    Par vince62fr dans le forum Langage
    Réponses: 5
    Dernier message: 24/03/2011, 18h22
  2. Réponses: 6
    Dernier message: 01/09/2010, 12h50
  3. [AC-2003] modifier les données dans le champs d'une table en sql
    Par carlostropico dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 01/12/2009, 16h24
  4. Réponses: 6
    Dernier message: 23/10/2005, 12h24
  5. Ajouter données dans un champ (concat)
    Par TNorth dans le forum Requêtes
    Réponses: 6
    Dernier message: 09/05/2005, 21h38

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