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 :

Problème sur déclencheur


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    janvier 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Service public

    Informations forums :
    Inscription : janvier 2022
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème sur déclencheur
    Bonjour j'aimerai un déclencheurs qui génèrerait une mise jour automatique en concaténant différents champ de cette même table.
    Dans une premier temps j'ai créé, mon expression de concaténation qui focntionne et me donne le bon resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select concat(concat(concat(concat(concat(concat(concat(concat(concat(concat('R',AXE),'_'),'PRD'),PLOD),'-'),ABSD),'_'),PLOF),'-'),ABSF) from SIR_ECRAN_ACOUSTIQUE_GLD;
    RESULTAT : RD939_PRD10-1115_11-63


    Maintenant je mets cet expression dans un déclencheurs mais la fonctionne ne donne aucun résultat, pouvez vous m'indiquer l'erreur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace TRIGGER SIR.UPD_SIR_ECRAN_ACOUSTIQUE_GLD
     
     AFTER UPDATE  ON SIR.SIR_ECRAN_ACOUSTIQUE_GLD
     
    BEGIN
     
     update SIR.SIR_ECRAN_ACOUSTIQUE_GLD   set     NOMROUTE = concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat('R',AXE),'_'),'PRD_'),PLOD),'-'),ABSD),'_'),'PRF_'),PLOF),'-'),ABSF) where NOMROUTE is null ;
     
    END;
    merci d'avance pour votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : décembre 2019
    Messages : 886
    Points : 1 421
    Points
    1 421
    Par défaut
    Bonjour,

    Tu cherches à mettre à jour une colonne de la table du trigger, tu n'as donc pas besoin d'instruction update, tu peux directement alimenter la colonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create or replace TRIGGER SIR.UPD_SIR_ECRAN_ACOUSTIQUE_GLD
     
    AFTER UPDATE ON SIR.SIR_ECRAN_ACOUSTIQUE_GLD
     
    BEGIN
     
    :NEW.NOMROUTE = concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat('R',AXE),'_'),'PRD_'),PLOD),'-'),ABSD),'_'),'PRF_'),PLOF),'-'),ABSF) ;
     
    END;

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    8 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2008
    Messages : 8 240
    Points : 17 205
    Points
    17 205
    Par défaut
    Et de manière générale préférez l'opérateur || plutôt que la fonction concat, plus concis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :NEW.NOMROUTE = 'R' || AXE || '_' || 'PRD_' || PLOD || '-' || ABSD || '_' || 'PRF_' || PLOF || '-' || ABSF;

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    juillet 2003
    Messages
    4 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : juillet 2003
    Messages : 4 575
    Points : 7 728
    Points
    7 728
    Billets dans le blog
    4
    Par défaut
    Pour utiliser les :new, il faut définir le trigger en BEFORE XXX FOR EACH ROW (le traitement doit être fait avant l'insertion réelle de la ligne et pour chaque ligne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create or replace TRIGGER SIR.UPD_SIR_ECRAN_ACOUSTIQUE_GLD
    BEFORE UPDATE ON SIR.SIR_ECRAN_ACOUSTIQUE_GLD
    FOR EACH ROW
    BEGIN
     :NEW.NOMROUTE = 'R'|| AXE ||'_PRD_'|| PLOD ||'-'|| ABSD ||'_PRF_'|| PLOF ||'-'|| ABSF;
    END;
    Attention, contrairement à l'update de la demande qui ne fait l'update que si NOMROUTE est NULL, ici on le fait tout le temps. S'il faut le faire, il faut tester la colonne.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    20 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 20 988
    Points : 49 813
    Points
    49 813
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Et de manière générale préférez l'opérateur || plutôt que la fonction concat, plus concis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :NEW.NOMROUTE = 'R' || AXE || '_' || 'PRD_' || PLOD || '-' || ABSD || '_' || 'PRF_' || PLOF || '-' || ABSF;
    Dans l'absolu cela ne fonctionne pas tout à fait de la même façon...
    1) en présence d'un NULL, il y a contamination via l'opérateur || alors que la fonction CONCAT remplace par une chaine vide
    2) la fonction CONCAT prend n'importe quel type d'expression pour la concaténation (nombre, temporels...) alors que l'opérateur || est limité aux littéraux.

    A +

    PS : cela dit, comme Oracle respecte peu la norme SQL, je sais pas si c'est vrai, car pas testé !
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    mai 2002
    Messages
    8 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 8 915
    Points : 29 804
    Points
    29 804
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    en présence d'un NULL, il y a contamination via l'opérateur || alors que la fonction CONCAT remplace par une chaine vide
    (...)
    PS : cela dit, comme Oracle respecte peu la norme SQL, je sais pas si c'est vrai, car pas testé !
    En effet, ce n'est pas vrai avec Oracle pour qui '' IS NULL.
    S'ils modifient ce comportement un jour, ça va faire très mal
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    8 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2008
    Messages : 8 240
    Points : 17 205
    Points
    17 205
    Par défaut
    Sauf pour || et/ou concat (qui sont la même chose en deux syntaxes différentes, l'une en fonction l'autre en opérateur), où le null est traité comme une chaîne vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select ''   || 'abc'       as c1
         , null || 'abc'       as c2
         , concat(''  , 'abc') as c3
         , concat(null, 'abc') as c4
      from dual;
     
    |  C1 |  C2 |  C3 |  C4 |
    |-----|-----|-----|-----|
    | abc | abc | abc | abc |
    Sur postgreSQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select ''   || 'abc'       as c1
         , null || 'abc'       as c2
         , concat(''  , 'abc') as c3
         , concat(null, 'abc') as c4
     
    |  c1 |     c2 |  c3 |  c4 |
    |-----|--------|-----|-----|
    | abc | (null) | abc | abc |
    MS SQL-Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select ''   + 'abc'        as c1
         , null + 'abc'        as c2
         , concat(''  , 'abc') as c3
         , concat(null, 'abc') as c4;
     
    |  c1 |     c2 |  c3 |  c4 |
    |-----|--------|-----|-----|
    | abc | (null) | abc | abc |
    Teradata :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select ''   || 'abc'       as c1
         , null || 'abc'       as c2
         , concat(''  , 'abc') as c3
         , concat(null, 'abc') as c4;
     
    |  c1 |     c2 |  c3 |     c4 |
    |-----|--------|-----|--------|
    | abc | (null) | abc | (null) |

  8. #8
    Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    janvier 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Service public

    Informations forums :
    Inscription : janvier 2022
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci d'avance pour toute vos réponses et votre temps passé ... a bientot

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/05/2004, 00h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 09h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 23h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 09h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 02h17

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