IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

INSERT INTO SELECT


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    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 : 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
    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 : 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
    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

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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 : 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
    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;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL : syntaxe insert into select
    Par chrislauxerrois dans le forum Access
    Réponses: 15
    Dernier message: 31/07/2006, 16h12
  2. [Oracle 9] Anomalie insert into select
    Par maxidoove dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/05/2006, 14h11
  3. probleme dans un INSERT INTO...........SELECT
    Par briiice dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/01/2006, 15h13
  4. Incrémenter champ : insert into . select max(.) + 1 from .
    Par ludo.guy dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/11/2004, 14h39
  5. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/11/2004, 17h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo