Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/04/2011, 16h13   #1
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Par défaut INSERT INTO SELECT

Bonjour à tous,

Je cherche à traduire une procédure stockée actuellement en T-SQL vers du PL/SQL mais je n'arrive pas à trouver la correspondance en PL/SQL..

Voici ma procédure sous Sybase

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE procedure proc_iev_doublons_alim_0903  
AS  
INSERT INTO DOUBLONS_IEV_0903   
SELECT DISTINCT IDENT_NOM,     
IDENTIFICATION.IDENT_IDENT,     
AGENT_IEV_NUMSS,     
REFGRADE_CODE,     
REFELT_CODE,     
IEV_MONTANT,     
AGENT_IEV_0903.REFCSO_CODE,     
AGENT_IEV_ENTITE,     
REFBUR_LIBELLE,     
count(1) NB_OCCURRENCES,     
AGENT_IEV_CIGAP     
FROM  IDENTIFICATION, AGENT_IEV_0903, IEV_0903, REFBUR    
WHERE IDENTIFICATION.IDENT_IDENT = AGENT_IEV_0903.IDENT_IDENT      
AND AGENT_IEV_CLE = IEV_CLE     
AND REFBUR.REFCSO_CODE=AGENT_IEV_0903.REFCSO_CODE     
AND REFBUR.REFBUR_CODE=AGENT_IEV_ENTITE     
AND IEV_TYPE='1'  
AND IEV_DOUBLON > 1    
GROUP BY IDENTIFICATION.IDENT_IDENT, IDENT_NOM, AGENT_IEV_CIGAP, AGENT_IEV_NUMSS, REFGRADE_CODE, REFELT_CODE, IEV_MONTANT,AGENT_IEV_0903.REFCSO_CODE, AGENT_IEV_ENTITE, REFBUR_LIBELLE    
HAVING count(1)>1     
ORDER BY IDENT_NOM

Et voici celle que j'ai fais en pl/sql

Code sql :
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
36
37
38
39
40
41
42
43
44
45
CREATE OR REPLACE
procedure proc_iev_doublons_alim 
	(
	moisDePaie IN number)
AS
BEGIN
	INSERT INTO DOUBLONS_IEV (DBIEV_IDENT,
	DBIEV_AAAAMM,
	DBIEV_IDENT_NOM,
	DBIEV_AGENT_IEV_NUMSS,
	DBIEV_REFGRADE_CODE,
	DBIEV_REFELT_CODE,
	DBIEV_IEV_MONTANT,
	DBIEV_REFCSO_CODE,
	DBIEV_AGENT_IEV_ENTITE,
	DBIEV_REFBUR_LIBELLE,
	DBIEV_NB_OCCURENCES,
	DBIEV_AGENT_IEV_CIGAP	)
 
	SELECT DISTINCT IDENTIFICATION.IDENT_IDENT,
		IEV_AAAAMM,
		IDENTIFICATION.IDENT_NOM,
		AGENT_IEV.AGENT_IEV_NUMSS,
		AGENT_IEV.REFGRADE_CODE, 
		IEV.REFELT_CODE, 
		IEV.IEV_MONTANT, 
		AGENT_IEV.REFCSO_CODE, 
		AGENT_IEV.AGENT_IEV_ENTITE, 
		REFBUR.REFBUR_LIBELLE, 
		count(1) AS NB_OCCURRENCES, 
		AGENT_IEV.AGENT_IEV_CIGAP 
	FROM IDENTIFICATION, AGENT_IEV, IEV, REFBUR 
	WHERE IDENTIFICATION.IDENT_IDENT = AGENT_IEV.AGENT_IEV_IDENT
	AND AGENT_IEV.AGENT_IEV_AAAAMM = moisDePaie
	AND AGENT_IEV_IDENT = IEV_IDENT
	AND AGENT_IEVAAAAMM = IEV_AAAAMM
	AND AGENT_IEV_ORDRE = IEV_ORDRE
	AND REFBUR.REFCSO_CODE = AGENT_IEV.REFCSO_CODE 
	AND REFBUR.REFBUR_CODE = AGENT_IEV_ENTITE 
	AND IEV_TYPE = '1' 
	AND IEV_DOUBLON > 1
	GROUP BY IDENTIFICATION.IDENT_IDENT, IEV_AAAAMM, IDENTIFICATION.IDENT_NOM, AGENT_IEV.AGENT_IEV_NUMSS, AGENT_IEV.REFGRADE_CODE, IEV.REFELT_CODE, IEV.IEV_MONTANT, AGENT_IEV.REFCSO_CODE, AGENT_IEV.AGENT_IEV_ENTITE, REFBUR.REFBUR_LIBELLE, AGENT_IEV.AGENT_IEV_CIGAP 
	HAVING count(1)>1 
	ORDER BY IDENT_NOM;
END proc_iev_doublons_alim;

Est-ce que ça vous parait logique ou pas du tout ?
J'ai vu qu'on pouvait mettre des values pour renseigner les champs mais je doute que ça fasse les mêmes insert qu'avec le select.

Enfin comme je ne suis pas sûr du tout, et que je suis un grand débutant, je préférais avoir vos avis..

Merci,
NarbOni
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 21h22   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Si votre table existe ça me paraît correct.
Le mot clef values après un insert ne permet d'insérer qu'une seule ligne, l'insert ensembliste c'est ce que vous avez écrit.

Vous devriez profiter de cette ré-écriture pour :
  • clarifier la mise en page du code
  • supprimer les éléments nécessaires (le distinct en plus du group by)
  • utiliser les jointures ANSI
  • rajouter les noms des schémas sur vos objets
  • utiliser des alias de table
  • mettre quelques commentaires ici où là
  • avoir un indicateur visuel pour différencier le code SQL du PL/SQL (par exemple, préfixer tous vos paramètres par p$_)

Faire "propre" ce n'est jamais du temps perdu.

Regardez ce que ça donne quand c'est propre (enfin c'est ma façon de coder, chacun la sienne, le tout est d'être cohérent) :
Code sql :
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
CREATE OR REPLACE procedure proc_iev_doublons_alim 
(
    p$_MoisDePaie IN number
) AS
begin
 
    INSERT INTO <mabase>.doublons_iev
    (
        dbiev_ident           ,
        dbiev_aaaamm          ,
        dbiev_ident_nom       ,
        dbiev_agent_iev_numss ,
        dbiev_refgrade_code   ,
        dbiev_refelt_code     ,
        dbiev_iev_montant     ,
        dbiev_refcso_code     ,
        dbiev_agent_iev_entite,
        dbiev_refbur_libelle  ,
        dbiev_agent_iev_cigap ,
        dbiev_nb_occurences   
    )
      SELECT idt.ident_ident     ,
             iev.iev_aaaamm      ,
             idt.ident_nom       ,
             agi.agent_iev_numss ,
             agi.refgrade_code   ,
             iev.refelt_code     ,
             iev.iev_montant     ,
             agi.refcso_code     ,
             agi.agent_iev_entite,
             reb.refbur_libelle  ,
             agi.agent_iev_cigap ,
             count(*)
        FROM <mabase>.identification idt
             INNER JOIN <mabase>.agent_iev agi
               ON agi.agent_iev_ident = idt.ident_ident 
             INNER JOIN <mabase>.iev
               ON iev.iev_ident  = agi.agent_iev_ident
              AND iev.iev_aaaamm = agi.agent_ievaaaamm
              AND iev.iev_ordre  = agi.agent_iev_ordre
             INNER JOIN <mabase>.refbur reb
               ON reb.refcso_code = agi.refcso_code
              AND reb.refbur_code = agi.agent_iev_entite
       WHERE agi.agent_iev_aaaamm = p$_MoisDePaie
         AND iev.iev_type         = '1' -- probablement commentaire ici
         AND iev.iev_doublon      > 1
    GROUP BY idt.ident_ident     ,
             iev.iev_aaaamm      ,
             idt.ident_nom       ,
             agi.agent_iev_numss ,
             agi.refgrade_code   ,
             iev.refelt_code     ,
             iev.iev_montant     ,
             agi.refcso_code     ,
             agi.agent_iev_entite,
             reb.refbur_libelle  ,
             agi.agent_iev_cigap ,
      HAVING count(*) > 1
    ORDER BY idt.ident_nom ASC;
 
end proc_iev_doublons_alim;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 09h10   #3
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Bonjour Waldar,

Je te remercie de ton retour ça me parait bien plus clair !
Je vais voir si je mets des alias pour mes tables car apparemment c'est pas ce qui est souhaité mais bon ça ne peut pas faire de mal...

Encore merci,
Bonne journée,
NarbO
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h32.


 
 
 
 
Partenaires

Hébergement Web