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 :

SQL dans Procédure stockée


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut SQL dans Procédure stockée
    Bonjour,

    je dois faire une requete de type WHERE truc IN ('x','y','z') dans une procédure stockée (appelée via JDBC) et le paramètre ('x','y','z'), je dois le passer en paramètre de la procédure (dans mon exemple, le paramètre est exp_liste_famsim). Mon problème est que ce paramètre est évalué en chaine de caractères par Oracle.
    Dois-je déclarer ce paramètre d'une autre manière?


    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
     
    PROCEDURE exportXML (    -- Id de l'export
                                    -- Liste des simulateurs de la forme ('AM1', 'AM2',...)  
                                    exp_liste_famsim IN VARCHAR2,
    				-- Moteur Avion  
                                    exp_mot_avion IN VARCHAR2,
                                    -- Code de retour (0:OK ; 1 KO)
                                    exp_ret OUT VARCHAR2) IS
     
    			id_export          schema1.xmlTypes.ID%Type;
    			configuration	   VARCHAR2(100);
    			liste_fam_sim	   VARCHAR2(100);
     
    BEGIN
     
    insert into schema1.xmlTypes (dateEx,fam,mot,id,data)
     values (TO_CHAR(sysdate, 'yyyymmdd'), exp_liste_famsim, exp_mot_avion, id_export, (XMLElement("FICHIER",
                                    XMLAttributes(configuration AS "configuration"),  ... select * from SIGNAUX s                                                                                 where S.FAM_SIM in exp_liste_famsim                                                                            and AV_MOT = exp_mot_avion...

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Je comprends pas très bien ta requête mais je comprends ce que tu veux faire (enfin je pense).

    Tu dois faire une requête dynamique du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    begin
       execute immediate '
          insert into ...
          select ...
          from  ...
          where truc IN (' || exp_liste_famsim || ')';
    end;
    Est-ce-que ca te convient ?

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    euuhh attention j'ai eu parfois des problèmes avec les retours à la ligne... il faut alors concaténer les différentes lignes de ton ordre SQL, en prenant soins de laisser un espace entre la fin d'une ligne et le début de la suivante...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    begin 
       execute immediate 'insert into ... ' 
                      || ' select ... ' 
                      || ' from  ... '
                      || ' where truc IN (' || exp_liste_famsim || ')'; 
    end;
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    oui mais comment dois-je passer le paramètre exp_fam_sim?

    si je passe exp_liste_famsim comme ceci: '''choix1'',''choix2''' , ca compile mais c pas ce que je veux puisqu'il considère logiquement la string ['choix1','choix2'].


    si je passe exp_liste_famsim comme ceci: 'choix1','choix2' , ca ne compile pas ...

    ma question est de savoir comment passer correctement la liste exp_fam_sim.

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Avec le code donné par Lalystar, il faux que tu appeles ta procédure de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exportXML (..., 'choix1, choix2');
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    mais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exportXML (..., 'choix1, choix2');
    ca ne marche pas non plus. il considère la string totale 'choix1, choix2'

  7. #7
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    J'aurais dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exportXML (..., '''choix1'', ''choix2''');

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '''choix1'',''choix2'''
    ca marche très bien dans le cas d'une substitution (notamment avec le SQL Editor de Toad)
    mais pour ma procédure stockée, je le passe en VARCHAR2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE exportXML (   
                                    -- Liste des simulateurs ('AM1', 'AM2',...)  
                                    exp_liste_famsim IN VARCHAR2,...)
    et là, ca ne marche plus...
    apparemment parce que je le passe en VARCHAR2.

    je pourrais peut etre le passer en autre chose que varchar2, non?

    vous voyez mon problème?

  9. #9
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Non il vaut mieux garder ta colonne en VARCHAR2.

    Tu peux lancer ta procédure à partir de SQL*Plus et indiquer le message d'erreur, stp.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    voici ma requete SQL*Plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     exec exportation.exportXML('''BISFCPC'',''BISFCPC''','A330GE')
    il n'ya pas d'erreur retournée puisque la requete est syntaxiquement correcte mais le résultat ne retourne rien puisque dans le WHERE fam_sim IN (exp_liste_famsim), exp_liste_famsim est une string.

    si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     exec exportation.exportXML('''BISFCPC''','A330GE')
    c OK.

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    je commence à me demander si on peut réellement passer un ensemble de valeurs...
    et si je vais pas devoir changer ma fonction...

  12. #12
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par julure
    mais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exportXML (..., 'choix1, choix2');
    ca ne marche pas non plus. il considère la string totale 'choix1, choix2'
    Je n'étais pas réveillé ce matin, milles excuses !!!

    Peux-tu remplacer le code donné par Lalystar par celui - ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PROCEDURE exportXML (...) is
       v_requete varchar2(1000);
    begin 
       v_requete := 'insert into ... ' 
                      || ' select ... ' 
                      || ' from  ... ' 
                      || ' where truc IN (' || exp_liste_famsim || ')'; 
      dbms_output.put_line (v_requete);
      execute immediate v_requete;
    end;
    et nous donner le résultat sous Sql+ (en ayant pensé à faire un set serveroutput on size 10000) ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  13. #13
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    WHERE fam_sim IN (exp_liste_famsim), exp_liste_famsim est une string

    non je suis pas d'accord quand tu crée la chaine de caractère qui contient la requête affiche la, pour voir vraiment ce qui est exécuté sur la base.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  14. #14
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    pour te répondre (plaineR):
    effectivement, je pense que si je crée ma requete sous forme de chaine et que je l'éxécute ca marchera sans aucun problème.

    Le seul hic, c que mon INSERT est fait directement dans ma procédure, sans passer par une chaine de caractère, donc ca m'oblige à rajouter des || et des ' un peu partout et sachant que ma requete fait 700 lignes (requete XML)... j'y suis encore demain!

    mais bon, je pense que je ne vais pas pouvoir faire autrement...
    il faut d'abord que je formate ma requête et ensuite que je l'execute sinon je n'y arrive pas.

    merci bcp

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

Discussions similaires

  1. Requête SQL particulière dans procédure stockée
    Par stephane.julien dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/05/2008, 10h56
  2. [PL/SQL] INSERT dans procédure stockées
    Par etoileDesNeiges dans le forum SQL
    Réponses: 5
    Dernier message: 12/12/2006, 14h18
  3. Sql 2000: Procédure stockée dans une vue
    Par MALAGASY dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/10/2006, 17h41
  4. procédures stockées dans procédure stockée
    Par olivc dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 30/05/2005, 16h58
  5. [PL/SQL] Appel procédure stockée dans trigger
    Par Félia dans le forum Oracle
    Réponses: 3
    Dernier message: 24/01/2005, 17h25

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