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 dynamique avec :new


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut insert dynamique avec :new
    salut
    je travail dans un trigger et je select des noms des champs dans une une autre table et je veux inserrer dans une table en concatinant les noms des champs puis la partie values là ou j'ai trouver le pb
    je dois concatiner les noms des champs dynamiques avec ':new.' et dans l'insert dynamique ne comprend pas (execute immediate)
    je travail avec oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    voila une partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for c in(select distinct nom_col from critere_regime_trav 
              union
              select distinct nom_col from critere_conge
              union
              select distinct nom_col from critere_cycle_conge) loop
              chaine_pers := chaine_pers||','||c.nom_col;
              values_chaine :=  values_chaine||','||':new.'||c.nom_col;
              end loop;
              chaine_pers := rtrim(chaine_pers,',');
              values_chaine := rtrim(values_chaine,',');
     
    execute immediate 'insert into pers_trig('||chaine_pers||') values('||values_chaine||')''';
    merci pour votre aide

  2. #2
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Ce serait largement mieux de nommer les colonnes.
    D'ailleurs, qu'est-ce qui fait que tu ne le fais pas mais utilise une horreur de code soit-disant dynamique ?

    Nicolas.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    salut
    merci pour votre réponse mais je select les noms des colonnes à partir du paramétrage l'utilisateur peut paramétrer ce qu'il veut et je dois gérer ça dynamiquement

  4. #4
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Et tout ca dans un trigger ? Et bien bon courage, meme si je suis presque sur qu'une meilleure solution est possible.
    Bref, as-tu essayer avec des bind variables ?
    De la forme
    ta_requete := 'insert into table (c1) value (:b1)';
    execute immediate ta_requete using :new.c1;

    Nicolas.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    merci encore une fois pour votre réponce mais pour mon cas c1 et une chaine
    dans la quelle je concatine une ensemble des noms de colonnes quelconques pour moi ect ce posssible d'adapter votre logique pour cas pareil si c'est possible ça sera impec
    merci d'avance

  6. #6
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Desole, je comprends rien a ta problematique. Peut-etre une nouvelle explication ?
    Dans tous les cas, le mieux est de faire l'execute immediate sur une variable contenant la requete a executer, ainsi tu peux utiliser dbms_output.put(var) pour voir la syntaxe de ta requete.
    Enfin, le :new n'est valide que pour les colonnes de la table sur laquelle le trigger a ete cree.

    Nicolas.

  7. #7
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    J'ajouterais : ta table pers_trig n'a pas plus de 1000 colonnes, ta table source non plus (celle du trigger), alors rien n'empeche d'ecrire ton insert "en dur" (il n'y pas de mal a cela) :
    insert into pers_trig (c1,c2,c3,...c1000) values (:new.c1,:new.c2,:new.c3,...,:new.c1000);

    Nicolas.

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    je vais poser ma question autrement
    j'ai ma req qui retourne un nom de colonne que je suis sur qu'il existe ds ma table pers_trig et ds la table sur la quelle existe le trigger mais je ne sais pas ce nom exacatement comment je peux recuperer la valeur du champs avec :new.
    c'est à dire le cursor c me raméne un nom qlq avec c.nom_col j'ai le nom
    commet je veux avoir la valeur du :new.c.nom_col j'espére que j'été clair cette fois
    merci Nicolas pour votre compréhention et patience

  9. #9
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Puis-je demander encore une fois pourquoi ne pas faire un INSERT classique ? Tu connais toutes les colonnes des deux tables... alors... il n'y a plus qu'a. Non ?

    Et puis, quelle est l'erreur exacte ?
    Tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    chaine_pers := chaine_pers||','||c.nom_col;
    values_chaine :=  values_chaine||','||':new.'||c.nom_col;
    end loop;
    chaine_pers := rtrim(chaine_pers,',');
    values_chaine := rtrim(values_chaine,',');
    Tu auras une virgule de trop a gauche. Ne serait-ce donc pas ltrim plutot que rtrim pour la supprimer ? As-tu prevu quelque chose si le curseur ne renvoi rien ? ...
    Il n'y aurait pas ces questions avec du code fixe.

    Nicolas.

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    voila le code exacte aprés modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     chaine_pers := chaine_pers||','||c.nom_col;
              values_chaine :=  values_chaine||','||:new.c.nom_col;
              end loop;*/
              chaine_pers := 'cod_soc,mat_pers'||rtrim(chaine_pers,',');
              values_chaine := ':new.cod_soc,:new.mat_pers'||rtrim(values_chaine,',')||')';
    la chaine renvoyée est à execute immediate est juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into pers_trig(cod_soc,mat_pers,COD_CLASS,COD_FIL,COD_GRAD,COD_SERV,COD_UR)
     values(:new.cod_soc,:new.mat_pers,:new.COD_CLASS,:new.COD_FIL,:new.COD_GRAD,:new.COD_SERV,:new.COD_UR)
    et le l'erreur est les variables de liens ne sont pas liées malgré que je suis dans un trigger

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    je vais poser une autre question pour rapprocher un peu ma problématique
    est ce que sous le noyau oracle existe une procedure/fonction qui joue le role
    de name_in sous forms

  12. #12
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Quel est le type du trigger ? Est-ce "FOR EACH ROW" ?
    Pour la question vis a vis de forms, je ne sais pas.

    Nicolas.

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    salut
    voila l'entéte du trigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE OR REPLACE TRIGGER maj_personnel
        AFTER insert or   UPDATE ON PERSONNEL for each row
    merci nicolas

  14. #14
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Il serait quand meme bien plus correct de :
    0. Un desc de la table
    1. presenter tout ton trigger
    2. presenter l'erreur exacte qui est retournee
    tout ca facile a faire avec du copier/coller.

    Nicolas.

  15. #15
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Points : 103
    Points
    103
    Par défaut
    ok désolé
    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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    SQL> desc personnel
    Name           Type          Nullable Default Comments                                                                           
    -------------- ------------- -------- ------- ---------------------------------------------------------------------------------- 
    COD_SOC        VARCHAR2(4)                    CODE SOCIETE                                                                       
    MAT_PERS       VARCHAR2(10)                   MATRICULE AGENT                                                                    
    COD_SERV       VARCHAR2(10)  Y                CODE SERVICE AGENT                                                                 
    COD_FONCT      VARCHAR2(4)   Y                CODE FONCTION AGENT                                                                
    COD_CATEG      VARCHAR2(4)   Y                CATEGORIE AGENT ( Gouvernement de la banque , encadrement,Cadre commun,caisse,...) 
    COD_CAT        VARCHAR2(4)   Y                GRADE AGENT ( REDACTEUR , AGENT COMPTABLE )                                        
    COD_GRAD       VARCHAR2(4)   Y                CLASSE AGENT (TROISIEME CLASSE , DEUXIEME CLASSE ...)                              
    COD_MOTIF      VARCHAR2(4)   Y                CODE MOTIF ( DISPONIBILITE CONVENANCE PERSONNELLE , DEPART DEFINITIF)              
    COD_NATP       VARCHAR2(4)   Y                CODE NATIONALITE ( tunisienne )                                                    
    COD_STAT       VARCHAR2(4)   Y                CODE STATUT (  REGIME CNRPS , STATUT IMPOT UNIQUEMENT )                            
    NOM_PERS       VARCHAR2(40)  Y                NOM AGENT                                                                          
    PREN_PERS      VARCHAR2(40)  Y                PRENOM AGENT                                                                       
    CIN            VARCHAR2(20)  Y                NUMERO CARTE IDENTITE                                                              
    SEXE           VARCHAR2(1)   Y                SEXE                                                                               
    DAT_SERV       DATE          Y                DATE AFFECTATION AU SERVICE                                                        
    DAT_FONCT      DATE          Y                DATE FONCTION                                                                      
    DAT_QUALF      DATE          Y                DATE QUALIFICATION                                                                 
    DAT_CATEG      DATE          Y                DATE CATEGORIE AGENT                                                               
    DAT_CAT        DATE          Y                DATE GRADE AGENT                                                                   
    DAT_GRAD       DATE          Y                DATE CLASSE AGENT                                                                  
    DAT_ECH        DATE          Y                DATE ECHELON AGENT                                                                 
    DAT_EMB        DATE          Y                DATE EMBAUCHE AGENT                                                                
    DAT_ENT        DATE          Y                DATE ENTREE GROUPE                                                                 
    DAT_TIT        DATE          Y                DATE TITULARISATION AGENT                                                          
    DAT_MOTIF      DATE          Y                DATE MOTIF AGENT                                                                   
    DAT_NAIS       DATE          Y                DATE NAISSANCE AGENT                                                               
    ETAT_ACT       VARCHAR2(1)   Y                Etat activite des agents                                                           
    PER_MAT_PERS   VARCHAR2(10)  Y                contenu dans la base vide                                                          
    QUALF          VARCHAR2(4)   Y                Qualification des agents                                                           
    COD_SIT        VARCHAR2(1)   Y                Code situation des agents ( A  actif  B bloque )                                   
    DAT_SIT        DATE          Y                Date de situation familiale                                                        
    CHEF_FAM       VARCHAR2(1)   Y                Agent chef famille ( oui , non)                                                    
    NBRE_ENF       NUMBER(2)     Y                NOMBRE ENFANTS                                                                     
    CHARG_ENF      VARCHAR2(4)   Y                NOMBRE ENFANTS A CHARGE                                                            
    CHARG_ALL      VARCHAR2(4)   Y                NOMBRE ENFANTS ALLOCATION FAMILIALE                                                
    FCT_FAM        VARCHAR2(1)   Y                COJOINT ACTIF ( OUI , NON )                                                        
    COD_ECH        NUMBER(2)     Y                CODE ECHELON                                                                       
    COD_AFFECT     VARCHAR2(4)   Y                CADRE ACTIVITE AGENT (  CADRE GENERAL,CHAUFFEUR,SECURITE ET GARDIEN)               
    COD_NIVEAU     VARCHAR2(5)   Y                                                                                                   
    NOM_JF         VARCHAR2(80)  Y                NOM DE JEUNE FILLE                                                                 
    NOM_PERS_A     VARCHAR2(60)  Y                NOM AGENT ARABE                                                                    
    PREN_PERS_A    VARCHAR2(60)  Y                PRENOM AGENT ARABE                                                                 
    POSTE_TRAV     VARCHAR2(15)  Y                FONCTION (POSTE DE TRAVAILLE)                                                      
    COD_METIER     VARCHAR2(4)   Y                CODE EMPLOIE                                                                       
    COD_USER       VARCHAR2(10)  Y                                                                                                   
    DAT_MAJ        DATE          Y                                                                                                   
    ADM_TECH       VARCHAR2(4)   Y                                                                                                   
    DAT_STAT       DATE          Y                                                                                                   
    DAT_CIN        DATE          Y                                                                                                   
    LIE_EMI_CIN    VARCHAR2(100) Y                                                                                                   
    DAT_AFFECT     DATE          Y                                                                                                   
    LIEU_NAIS      VARCHAR2(200) Y                                                                                                   
    COD_LIEU_GEOG  VARCHAR2(10)  Y                                                                                                   
    DAT_LIEU_GEOG  DATE          Y                                                                                                   
    GRP_SANG       VARCHAR2(3)   Y                GROUPE SANGUIN                                                                     
    NUM_RETR       VARCHAR2(10)  Y                NUMERO DE RETRAITE                                                                 
    COD_FIL        VARCHAR2(4)   Y                                                                                                   
    DAT_FIL        DATE          Y                                                                                                   
    SERV_MIL       VARCHAR2(2)   Y                                                                                                   
    CODE_DOMAINE   VARCHAR2(10)  Y                                                                                                   
    COD_UR         VARCHAR2(10)  Y                                                                                                   
    COD_CLASS      VARCHAR2(4)   Y                                                                                                   
    DAT_CLASS      DATE          Y                                                                                                   
    COD_TYP_DEPART VARCHAR2(4)   Y                                                                                                   
    DAT_DEPART     DATE          Y                                                                                                   
    DAT_UR         DATE          Y                                                                                                   
    ORG_SERV       VARCHAR2(15)  Y                                                                                                   
    DAT_POSTE_TRAV DATE          Y                                                                                                   
    COD_NAT_RECR   VARCHAR2(4)   Y                                                                                                   
    DAT_ADM_TECH   DATE          Y                                                                                                   
    DAT_ORG_SERV   DATE          Y                                                                                                   
    NOM_JF_A       VARCHAR2(40)  Y                NOM DE JEUNE FILLE DEUXIEME LANGUE                                                 
    COD_CAT_CLASS  VARCHAR2(4)   Y                CATEGORIE CLASSE                                                                   
    MAINTIEN_PERS  VARCHAR2(1)   Y                                                                                                   
    MAINTIEN_DATE  DATE          Y                                                                                                   
    TYP_RANG       VARCHAR2(1)   Y                C : CONSEILLIER , P : CHEF DE PROJET
    et la table pers_trig possede la méme structure que personnel
    et le trigger
    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
     
    CREATE OR REPLACE TRIGGER maj_personnel
        AFTER insert or   UPDATE ON PERSONNEL for each row 
     
     
    declare
     
    chaine_pers varchar2(100):='';
    values_chaine varchar2(150) := '';
    ma_req varchar2(200);
     
    BEGIN
     
    delete pers_trig;
    -----------------------------------------------
    for c in(select distinct nom_col from critere_regime_trav 
              union
              select distinct nom_col from critere_conge
              union
              select distinct nom_col from critere_cycle_conge) loop
              chaine_pers := chaine_pers||','||c.nom_col;
              values_chaine :=  values_chaine||','||:new.c.nom_col;
              end loop;
              chaine_pers := 'cod_soc,mat_pers'||rtrim(chaine_pers,',');
              values_chaine := ':new.cod_soc,:new.mat_pers'||rtrim(values_chaine,',')||')';
               ma_req := 'insert into pers_trig('||chaine_pers||') values('||values_chaine;*/
    execute immediate ma_req;          
    insert into pers_trig(cod_soc,mat_pers,COD_UR,COD_CLASS,COD_GRAD,COD_FIL,cod_serv) 
    values(:new.cod_soc,:new.mat_pers,:new.cod_ur,:new.cod_class,:new.cod_grad,:new.cod_fil,:new.cod_serv);
    END;
    j'espére que j'ai rien oblié

Discussions similaires

  1. [UI] Insertion dynamique Datepicker avec un bouton
    Par tonycemalin dans le forum jQuery
    Réponses: 20
    Dernier message: 27/07/2012, 11h44
  2. Insertion dynamique d'images dans crystal report avec c# 3.5
    Par devvanjier dans le forum Windows Forms
    Réponses: 0
    Dernier message: 08/12/2009, 18h35
  3. INSERT dynamique avec mise à jour du Resultset
    Par Titounet007 dans le forum JDBC
    Réponses: 2
    Dernier message: 16/10/2009, 11h43
  4. Image dynamique avec insertion d'un compteur aléatoire
    Par maitaddi dans le forum Imagerie
    Réponses: 1
    Dernier message: 11/09/2009, 11h07
  5. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 11h50

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