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

SQL Oracle Discussion :

Procédure stockée avec variables IN et OUT


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 66
    Points : 64
    Points
    64
    Par défaut Procédure stockée avec variables IN et OUT
    Bonjour,

    Je fais appel à vos science car je ne maîtrise pas bien la syntaxe des procédures stockées lorsqu'on veut récupérer un OUT.

    Ma situation est la suivante : J'ai l'habitude d'utiliser des curseurs pour faire des inserts simples. Celui que j'ai réalisé est très simple et fonctionne très bien :

    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
    DECLARE
      CURSOR c IS
        SELECT annee, mois
          FROM dw_date
          GROUP BY annee, mois;
    BEGIN
     
      FOR c_rec IN c LOOP
     
        INSERT INTO tdb_countpers
        SELECT c_rec.annee, c_rec.mois, num_secteur, Count(DISTINCT(num_pers))
            FROM dossier
            WHERE date_entree <= Last_Day(To_Date('01/'||c_rec.mois||'/'||c_rec.annee,'dd/MM/yyyy'))
            AND (date_sortie IS NULL OR date_sortie >= To_Date('01/'||c_rec.mois||'/'||c_rec.annee,'dd/MM/yyyy'))
            GROUP BY c_rec.annee, c_rec.mois, num_secteur;
     
      END LOOP;
    --EXCEPTION
    --  WHEN Others THEN
    END;
    Ce petit cursor va simplement écrire des enregistrements dans une table tdb_countpers. Cela fonctionne bien mais je souhaiterais aller un peu plus loin.

    Je souhaiterais écrire une procédure stockée qui produit sensiblement le même résultat, mais qui au lieu de faire un INSERT, fait un SELECT INTO de façon à récupérer ce select en appelant la procédure avec un ETL.

    J'ai rédigé la procédure suivante :

    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
    CREATE OR REPLACE PROCEDURE p_tdb_countpers (
      pAnnee IN OUT NUMBER, 
      pMois IN OUT NUMBER, 
      outSECTEUR OUT NUMBER, 
      outNBPERS OUT NUMBER) IS
     
    BEGIN
     
        SELECT pAnnee, pMois, num_secteur, Count(DISTINCT(num_pers))
        INTO pAnnee, pMois, outSECTEUR, outNBPERS
            FROM dossier
            WHERE date_entree <= Last_Day(To_Date('01/'||pMois||'/'||pAnnee,'dd/MM/yyyy'))
            AND (date_sortie IS NULL OR date_sortie >= To_Date('01/'||pMois||'/'||pAnnee,'dd/MM/yyyy'))
            GROUP BY pAnnee, pMois, num_secteur;
     
    END p_tdb_countpers ;
    /
    Mais lorsque je l'appelle avec l'ETL en injectant l'année et le mois, j'ai une erreur oracle "ORA-01422: l'extraction exacte ramène plus que le nombre de lignes demandé" que je comprends tout à fait (je ramène plus d'un enregistrement) mais que je ne parviens pas à corriger. Sauriez-vous m'aider à résoudre ce problème ?

    Avec mes remerciements anticipés !

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Un paramètre standard (NUMBER, VARCHAR, etc..) dans une procédure est forcément une variable unique.
    Un SELECT INTO une variable est forcément sur une seule ligne.

    Un select into avec plusieurs lignes est forcément dans une Collection http://sheikyerbouti.developpez.com/...age=Chap5#L5.5

    Une procédure ou fonction qui ramène plusieurs lignes : Utiliser du Pipeline http://sheikyerbouti.developpez.com/...age=Chap4#L4.4
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Procédure stockée avec paramètres variables
    Par Devlin111 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/05/2012, 13h47
  2. Réponses: 26
    Dernier message: 24/06/2009, 09h32
  3. Procédure stockée avec order by variable
    Par Le-Cortex dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/07/2007, 15h20
  4. Procédure stockée avec une variable "OUT"
    Par Cpas2latarte dans le forum SQL
    Réponses: 5
    Dernier message: 13/03/2007, 10h22
  5. Procédure stockée avec variable en clause FROM
    Par Richard MORRISSEY dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/11/2006, 16h00

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