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 :
Ce petit cursor va simplement écrire des enregistrements dans une table tdb_countpers. Cela fonctionne bien mais je souhaiterais aller un peu plus loin.
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;
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 :
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 ?
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 ; /
Avec mes remerciements anticipés !
Partager