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 :
- S_CHW_NB
- S_CHW_PC
- S_CHW_WS
- 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 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
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 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
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;
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 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; /
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
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;
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;
Partager