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;