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:
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:
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 !