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 :

[18c] Requête dynamique avec un count(*)


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut [18c] Requête dynamique avec un count(*)
    Bonjour à tous,

    Dans un script je dois construire une requête à partir de la lecture d'un fichier CSV. (pas important pour le problème).

    Au final, j'obtiens une requête toute simple du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(*) FROM ma_table
    WHERE (champ1, champ2) IN ( ('val1_1','val1_2') , ('val2_1','val2_2') , ('val3_1','val3_2')  );
    Et je veux maintenant récupérer la valeur du COUNT(*).

    Je passe donc par du SQL dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE
        v_req_vet   VARCHAR2(1024);
        v_result    VARCHAR2(5);
    BEGIN
        v_req_vet := 'SELECT COUNT(*) FROM ma_table WHERE (champ1, champ2) IN ( ('val1_1','val1_2') , ('val2_1','val2_2') , ('val3_1','val3_2')  ) INTO :1';
     
     
        EXECUTE IMMEDIATE v_req_vet INTO v_result;
     
     
        DBMS_OUTPUT.PUT_LINE('Resultat : ' || v_result);
    END;

    Et donc bien sûr ça ne marche pas.
    Je suis même embêté par les quotes qui entourent les valeurs. ça marche en doublant les quotes ?

    Si vous avez une solution, ce serait super.

    Merci


    Michel

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 167
    Par défaut
    Oui, si ce sont des valeurs en dur alors il faut doubler les quotes. Sinon méthode similaire que j'ai décrite dans ton précédent topic en splittant les valeurs sous forme de lignes.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 133
    Par défaut
    Si le texte de la requête n'est pas variable, il n'est pas nécessaire de passer par du SQL dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
        v_result    VARCHAR2(5);
    BEGIN
        SELECT  COUNT(*)
        INTO    v_result
        FROM    ma_table 
        WHERE   (champ1, champ2) 
                IN  (   ('val1_1',  'val1_2')
                    ,   ('val2_1',  'val2_2') 
                    ,   ('val3_1',  'val3_2')  
                    ); 
        DBMS_OUTPUT.PUT_LINE('Resultat : ' || v_result);
    END;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Merci pour ta réponse, j'ai vu effectivement ton message.
    Je ne suis pas sûr d'avoir tout compris.
    Pour l'instant ce que j'ai mis fonctionne, et je ne veux pas tout refaire.

    Pour revenir au problème de la récupération de mon count(*), c'est ça le problème principal.

    La syntaxe que j'ai utilisée dans mon exemple ne fonctionne pas.

    Je ne dois pas exécuter correctement le EXECUTE IMMEDIATE.
    L'objectif est bien de récupérer le nombre de lignes envoyées avec le count(*).

    Sauf si je n'ai vraiment pas compris ta réponse.


    Michel

  5. #5
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Si le texte de la requête n'est pas variable, il n'est pas nécessaire de passer par du SQL dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
        v_result    VARCHAR2(5);
    BEGIN
        SELECT  COUNT(*)
        INTO    v_result
        FROM    ma_table 
        WHERE   (champ1, champ2) 
                IN  (   ('val1_1',  'val1_2')
                    ,   ('val2_1',  'val2_2') 
                    ,   ('val3_1',  'val3_2')  
                    ); 
        DBMS_OUTPUT.PUT_LINE('Resultat : ' || v_result);
    END;

    Merci pour ta réponse.
    Je construits ma requête dynamiquement, pour au final obtenir une variable contenant la dite requête.
    Et je dois donc la lancer avec un EXECUTE IMMEDIATE, et récupérer la valeur du count(*).

    Michel

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 133
    Par défaut
    Quelle est la partie variable dans la requête qui t'imposerait de la construire dynamiquement ?

    Citation Envoyé par Michel38 Voir le message
    La syntaxe que j'ai utilisée dans mon exemple ne fonctionne pas.
    Tu obtiens certainement un message d'erreur à l'exécution... Que dit-il ?

    As-tu essayé en respectant la syntaxe proposée par Oracle, c'est-à-dire en plaçant la clause INTO avant la clause FROM ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Quelle est la partie variable dans la requête qui t'imposerait de la construire dynamiquement ?


    Tu obtiens certainement un message d'erreur à l'exécution... Que dit-il ?

    As-tu essayé en respectant la syntaxe proposée par Oracle, c'est-à-dire en plaçant la clause INTO avant la clause FROM ?
    Je construits ma requête à partir d'un fichier CSV, qui est dans cette syntaxe :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    val1_1;val1_2
    val2_1;val2_2
    val3_1;val3_2
    Et donc, j'ai une boucle qui récupère le contenu de ce fichier CSV, et qui ajoute les valeurs de chaque tuple dans ma requête.
    A la fin de cette boucle, j'ai donc une requête complète avec toutes les valeurs nécessaires.

    Et l'étape d'après, c'est de lancer cette requête, pour récupérer le nombre de lignes qui correspondent à la condition de ma requête.

    Et c'est là que j'ai un problème.

    Dans l'environnement où je lance ma requête, j'ai le message ORA-00920: opérateur relationnel non valideMichel

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 133
    Par défaut
    Ce qui serait intéressant, c'est que tu affiches la requête construite par ta procédure pour t'assurer qu'elle ne comporte aucune erreur.

    Une autre manière de construire ta requête serait de passer par une table de travail dans laquelle seront enregistrés les couples de valeurs provenant du csv. En utilisant celle-ci dans la requête de comptage, il ne sera plus nécessaire de passer par une requête dynamique.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre éclairé Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 225
    Par défaut
    Bon et bien à force de m'arracher les cheveux, j'ai finalement trouvé la cause du pourquoi.

    Ma requête se termine par un point virgule.

    Et apparemment il ne faut pas de point virgule quand on lance une requête avec un EXECUTE IMMEDIATE.


    Merci à tous.


    Michel

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

Discussions similaires

  1. Requête SQL avec Having Count
    Par illight dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/10/2013, 14h00
  2. Requête dynamique avec l'api Criteria
    Par Keitaro44 dans le forum JPA
    Réponses: 0
    Dernier message: 04/03/2012, 22h26
  3. Requête SQL avec 2 count
    Par la_chouette dans le forum Langage SQL
    Réponses: 24
    Dernier message: 27/06/2011, 09h45
  4. [MySQL] Requête SQL avec un Count.
    Par Requiem11 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/05/2009, 11h01
  5. Requête dynamique avec des chaînes Unicodes
    Par Adorien dans le forum Développement
    Réponses: 4
    Dernier message: 15/05/2008, 11h35

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