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 !