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 :

Exécution d'une requête SQL, qui retourne une table


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Exécution d'une requête SQL, qui retourne une table
    Bonjour à tous,

    Tout d'abord je précise que je débute en PL SQL, j'ai quelques expériences en SQL en revanche.
    J'ai pour but de vérifier les doublons sur une table donnée.
    J'ai réussis a créer une procédure qui me retourne tous les doublons d'une table, dans une autre table, comme ceci :

    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
    32
    33
    34
    35
    DECLARE
     
    table_t LONG;
     
    TYPE tab_champs IS VARRAY (100) OF LONG;
    t_champs tab_champs;
     
    BEGIN
    -- CHAMPS A RENSEIGNER
    table_t := 'MB_cibleProEquipement' ;
    t_champs := tab_champs('REFR_PRDT');
     
    -- REQUETE QUI S'EXECUTE
    Execute immediate
    'DROP table TP_VERIF_DOUBLONS';
     
    Execute immediate 
    '
      Create table TP_VERIF_DOUBLONS AS 
      select 
            a.*
         from
            '||table_t||' a
            , (
                select '||t_champs(1)||' 
                from  '||table_t||'
                group by '||t_champs(1)||'
                having count('||t_champs(1)||')>1
              ) b
         where a.'||t_champs(1)||' = b.'||t_champs(1)||'
         order by a.'||t_champs(1)||'
     '
     ;
     
     END;
    Je retourne ici tous les doublons sur le champ "refr_prdt" qui se trouvent dans la table MB_cibleProEquipement, et je met les lignes doublonnées dans la nouvelle table "TP_VERIF_DOUBLONS".
    Jusqu'ici tout fonctionne correctement.
    Je voudrais maintenant créer la meme chose mais en FONCTION PLSQL. C'est à dire pouvoir appeler ma fonction avec un
    "select verif_doublons("MB_cibleProEquipement","refr_prdt") from dual;" et avoir le résultat en sortie.

    J'ai essayé plusieurs choses, dont entre autre :
    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
    CREATE OR REPLACE FUNCTION verif_doublons(table_t in varchar2, champs_t in varchar2)
       RETURN SYS_REFCURSOR
    AS
       o_cursor   SYS_REFCURSOR;
    BEGIN
     OPEN o_cursor FOR
    execute immediate (
    '   
           select 
                a.*
            from
                '|| table_t ||' a
                , (
                    select '||champs_t||'
                    from  '||table_t||'
                    group by '||champs_t||'
                    having count('||champs_t||')>1
                  ) b
            where a.'||champs_t||' = b.'||champs_t||'
            order by a.'||champs_t||';
    '
    );
       RETURN o_cursor;
     -- exception part
    END;
    Plusieurs erreurs apparaissent, j'ai besoin de vos compétences plus complète dans le domaine
    Merci à tous !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par Nowstil Voir le message
    Plusieurs erreurs apparaissent
    Lesquelles ?
    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.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Pour cette version :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR line 7, col 9, ending_line 7, ending_col 17, Found 'immediate', Expecting: ;  USING   -or-   ||   -or-   /   -or-   **   -or-   (+)   -or-   %  .  [   -or-   :  @  CASE  CONNECT_BY_ROOT  decimal number  EXISTS  FALSE  float  integer  NEW  PRIOR  SQL  TRUE   -or-   (  *  +  -  AT  CONTINUE  CURSOR  DAY  identifier  MOD  MODEL  MULTISET  NOT  NULL  REM  string  THE  WHEN  YEAR

  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
    Quand ça ne marche pas lisez toujours la doc (RTFM) : Open For

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour Mnitu,

    J'ai lu la doc, meme si je n'ai pas tout saisi, mais cela ne m'aide pas a résoudre mon problème.
    Le fait est que je ne sais même pas si je dois utiliser un cursor ou non.
    Suis-je déja sur la bonne voie?

  6. #6
    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
    Si votre problème est juste comment créer une fonction qui renvoie un ref_curseur la doc devez fous fournir la syntaxe a utiliser.
    Si votre problème est comment trouver/supprimez les doublons d'une table alors il s'agit plutôt d'une requête "modèle" qui n'implique pas du encodage en PL/SQL.
    Si vous devez écrire du code générique pour ce problème d'affichage/suppression des doublons vous pouvez le faire d'une manière simple via un pauvre script SQL. Sinon il faut employer les types opaques ANYDATA etc. mais franchement je ne vois pas l'intérêt.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Mon problème est de savoir comment créer une fonction PLSQL qui prend comme paramètre une table et un champ et qui retourne tous les doublons dus à ce champ dans cette table.
    J'ai dans un premier temps résolu le problème en retournant tout ces doublons dans une table appelée "TP_VERIF_DOUBLONS" (CF le 1er script de mon premier message).
    Ce que je voudrais maintenant c'est que ces doublons apparaissent dans l'output en appelant cette fonction avec un :

    select verif_doublons("MA_TABLE","MON_CHAMP") from dual

    La requete SQL qui retourne ces doublons est déja créer (elle est dans les 2 codes de mon premier message).
    Est-ce plus clair?

  8. #8
    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
    Créez et utilisez une fonction pipelined dans ce cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from table(verif_doublons("MA_TABLE","MON_CHAMP"))

  9. #9
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Je trouve la proposition de mnitu est bien.
    Sinon une autre idée peut t'aider
    http://www.developpez.net/forums/d14...e/#post8080129
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/08/2009, 21h14
  2. Requete SQL qui retourne une erreur
    Par gregal dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/03/2008, 23h05
  3. Une Fonction SQL qui retourne le résultat d'une requête
    Par kamacho25 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/09/2007, 10h44
  4. [SQL] Choix dans une liste déroulante issue d'une requête SQL
    Par Moustic74 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/06/2007, 14h06
  5. Exécution d'une requête SQL qui affiche un message
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 29/11/2006, 16h15

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