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 d'exécution d'un trigger


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Par défaut Problème d'exécution d'un trigger
    Le problème apparaît au niveau de l'exécution, le trigger consiste de construire une clé primaire pour la table C_HW à partir de quatre séquences qui sont :
    1. S_CHW_NB
    2. S_CHW_PC
    3. S_CHW_WS
    4. S_CHW_SV


    Le trigger se lance avant l'insertion d'un nouveau matériel dans la table C_HW :

    • si le matériel est un ordinateur portable, alors on ajoute NB comme préfixe à la valeur de la séquence S_CHW_NB après avoir transformé cette dernière en une chaîne de trois caractères.
    • si c'est un ordinateur de bureau alors même travail avec un préfixe PC et la séquence S_CHW_PC.
    • si c'est une station de travail, alors on ajoute le préfixe WS avec la séquence S_CHW_WS.
    • si c'est un serveur, alors on ajoute le préfixe SV avec la séquence S_CHW_SV.


    Table C_HW :
    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
    CREATE TABLE  "C_HW" 
       (	"CH_ART" VARCHAR2(10), 
    	"CH_HERST" VARCHAR2(20), 
    	"CH_TYPE" VARCHAR2(20) NOT NULL ENABLE, 
    	"CH_LIEF" VARCHAR2(20), 
    	"CH_PREIS" NUMBER, 
    	"CH_BEZ" VARCHAR2(25) NOT NULL ENABLE, 
    	"CH_CPU" VARCHAR2(20), 
    	"CH_RAM" VARCHAR2(20), 
    	"CH_FP" VARCHAR2(40), 
    	"CH_LIEF_DAT" DATE, 
    	"CH_FREIGAB_NR" VARCHAR2(20), 
    	"CH_BESTELL_NR" VARCHAR2(20), 
    	"CH_BEM" VARCHAR2(500), 
    	"CH_BEST_DAT" DATE, 
    	"CH_FREIGAB_DAT" DATE, 
    	 CONSTRAINT "C_HW_PK" PRIMARY KEY ("CH_ART") ENABLE, 
    	 CONSTRAINT "C_HW_B_U" UNIQUE ("CH_BEZ") ENABLE
       )
    /
    Code des séquences :
    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
    CREATE SEQUENCE "S_CHW_NB"
    MINVALUE 0 MAXVALUE 999
    INCREMENT BY 1 START WITH 12
    NOCACHE NOORDER CYCLE;
     
    CREATE SEQUENCE "S_CHW_PC"
    MINVALUE 0 MAXVALUE 999
    INCREMENT BY 1 START WITH 0
    NOCACHE NOORDER  CYCLE;
     
    CREATE SEQUENCE "S_CHW_SV"
    MINVALUE 0 MAXVALUE 999
    INCREMENT BY 1 START WITH 0
    NOCACHE NOORDER CYCLE;
     
    CREATE SEQUENCE "S_CHW_WS"
    MINVALUE 0 MAXVALUE 999
    INCREMENT BY 1 START WITH 5
    NOCACHE NOORDER CYCLE;
    Code du 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
    create or replace trigger "T_CHW_K"
    BEFORE
    insert on "C_HW"
    for each row
     
     DECLARE 
        CHT  C_HW.CH_TYPE%TYPE;
        CHRR  C_HW.CH_ART%TYPE;
     
     BEGIN 
         CHT :=:NEW.CH_TYPE; 
         CHRR := FADDA(CHT);     
         :NEW.CH_ART := CHRR;
     end;
    /
    Ici le trigger fait appel a la fonction CL_CHW qui permet de retourner la nouvelle valeur de la clé :

    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 function "CL_CHW"
    (CHT in C_HW.CH_TYPE%TYPE)
    return VARCHAR2
    is
        CH VARCHAR2(10);
        CH1 VARCHAR2(10);
        CH2 VARCHAR2(10);
        N NUMBER(3);
        CHS CHAR;
        CHRR C_HW.CH_ART%TYPE;
    BEGIN
     IF UPPER(CHT)= 'LAPTOP' THEN
        begin
          SELECT S_CHW_NB.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
             BEGIN
               CH:=TO_CHAR(N);
               --CH1:=lpad(CH,2,'0');
               CHS:='00';
               CH1:=CONCAT(CHS,CH);
             END;
           ELSIF (N<100) THEN
             begin 
              CH:=TO_CHAR(N);
              --CH1:=lpad(CH,2,'0');
              CH1:=CONCAT('0',CH);
          end;
          END IF;
    Le problème est partiellement résolu, je n'ai plus d'erreur, l'insertion est effectuée, car le problème était au niveau de la déclaration dans la fonction
    j'ai déclaré en premier lieu CHS comme char, maintenant avec CHAR(2), l'exécution marche.
    Mais, l'insertion ne fait que le préfixe dans la table.
    J'ai essayé d'insérer un nouveau laptop, j'ai trouvé la clé NB au lieu de NB001...


    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    create or replace function "CL_CHW"
    (CHT in C_HW.CH_TYPE%TYPE)
    return VARCHAR2
    is
        CH VARCHAR2(3);
        CH1 VARCHAR2(5);
        CH2 VARCHAR2(2);
        N NUMBER(3);
        CHS CHAR(2);
        CHRR C_HW.CH_ART%TYPE;
    BEGIN
     IF UPPER(CHT)= 'LAPTOP' THEN
        begin
          SELECT S_CHW_NB.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
             BEGIN
               CH:=TO_CHAR(N);
               --CH1:=lpad(CH,2,'0');
               CHS:='00';
               CH1:=CONCAT(CHS,CH);
             END;
           ELSIF (N<100) THEN
             begin 
              CH:=TO_CHAR(N);
              --CH1:=lpad(CH,2,'0');
              CH1:=CONCAT('0',CH);
          end;
          END IF;
          CH2:='NB';
          CHRR:=CONCAT(CH2,CH1);
     
        end;
     
      ELSIF UPPER(CHT)= 'DESKTOP' THEN
        begin  
           SELECT S_CHW_PC.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
            begin
               CH:=TO_CHAR(N);
               --CH1:=lpad(CH,2,'0');
               CHS:='00';
               CH1:=CONCAT(CHS,CH);
            end;
           ELSIF (N<100) THEN
             begin
              CH:=TO_CHAR(N);
              --CH1:=lpad(CH,1,'0');
              CHS:='0';
              CH1:=CONCAT(CHS,CH);
             end;
          END IF;
          CH2:='PC';
          CHRR:=CONCAT(CH2,CH1);
        end;
     
      ELSIF UPPER(CHT)= 'SERVER' THEN
        begin  
           SELECT S_CHW_SV.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
            begin
             CH:=TO_CHAR(N);
             --CH1:=lpad(CH,2,'0');
             CHS:='00';
             CH1:=CONCAT(CHS,CH);
            end;
           ELSIF N<100 THEN
             begin
              CH:=TO_CHAR(N);
              --CH1:=lpad(CH,1,'0');
              CHS:='0';
              CH1:=CONCAT(CHS,CH);
             end;
          END IF;
          CH2:='SV';
          CHRR:=CONCAT(CH2,CH1);
        end; 
     
      ELSIF UPPER (CHT)= 'CAD' THEN
        begin  
          SELECT S_CHW_WS.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
            begin
              CH:=TO_CHAR(N);
              --CH1:=lpad(CH,2,'0');          
               CHS:='00';
               CH1:=CONCAT(CHS,CH);
            end;
           ELSIF N<100 THEN
             begin
              CH:=TO_CHAR(N);
              --CH1:=lpad(CH,1,'0');
               CHS:='0';
               CH1:=CONCAT(CHS,CH);
             end;
          END IF;
           CH2:='WS';
           CHRR:=CONCAT(CH2,CH1);
        end;
     
       ELSE RAISE_APPLICATION_ERROR(-20010, 'the type of computer is not existing, existings type : laptop, cad, desktop, server');
      END IF;
     
    RETURN CH2;
    END CL_CHW;

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Peut-être parce que tu retournes CH2 au lieu de CHRR ?

    NB: Pourquoi n'utilises-tu pas lpad, ce qui simplifierai beaucoup ton code ?
    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
    CREATE OR REPLACE FUNCTION "CL_CHW"
    (CHT IN C_HW.CH_TYPE%TYPE)
    RETURN VARCHAR2
    IS
        CH2 VARCHAR2(2);
        N NUMBER(3);
    BEGIN
     IF UPPER(CHT)= 'LAPTOP' THEN
        SELECT S_CHW_NB.NEXTVAL 
        INTO N
        FROM DUAL;
        CH2:='NB';
      ELSIF UPPER(CHT)= 'DESKTOP' THEN
           SELECT S_CHW_PC.NEXTVAL 
           INTO N
           FROM DUAL;
          CH2:='PC';
     
      ELSIF UPPER(CHT)= 'SERVER' THEN
           SELECT S_CHW_SV.NEXTVAL 
           INTO N
           FROM DUAL;
          CH2:='SV';
     
      ELSIF UPPER (CHT)= 'CAD' THEN
          SELECT S_CHW_WS.NEXTVAL 
           INTO N
           FROM DUAL;
           CH2:='WS';
        end;
     
       ELSE RAISE_APPLICATION_ERROR(-20010, 'the type of computer is not existing, existings type : laptop, cad, desktop, server');
      END IF;
     
    RETURN CH2 || lpad(n, 3, '0');
    END CL_CHW;

  3. #3
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Par défaut
    C'est vraiment magnifique d'être un abonné de ce forum, vraiment je vous remercie de tout mon cœur, et j'espère que je pourrais aussi aider des abonnés après un moment car je suis encore débutant en PL/SQL.


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

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/01/2007, 09h29
  2. Problème lors de l'exécution d'un trigger
    Par Madoka dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 30/06/2006, 08h33
  3. Problème d'exécution : 'rtl60.bpl introuvable'
    Par zeddy23 dans le forum EDI
    Réponses: 3
    Dernier message: 27/07/2005, 20h44
  4. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

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