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 !