Je suis en train d'écrire un trigger en PL/SQL sous Oracle 8.1.7.
Je construis une requête que je stocke dans une variable VARCHAR2 de taille 32 767 (le maximum, apparement).
J'obtiens l'erreur suivante :Je suppose que ca veut dire que ca ne rentre pas (trop de caractères).Envoyé par Erreur SQL
Voici la première partie (qui fonctionne). Je la mets juste pour montrer comment je rempli les 2 variables DmlStr1 et DmlStr2 :
Et voici la partie qui pose problème, parce que j'essais de stocker plus de 34 040 caractères dans la variable DmlStr :
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 DmlStr VARCHAR2(32767); DmlStr1 VARCHAR2(15000); DmlStr2 VARCHAR2(15000); PremierChamp NUMBER; -- Recherche de la liste des champs de la table DOSSIER. Cursor CurListeChampsDossier is select COLUMN_NAME from sys.all_tab_columns where TABLE_NAME = 'DOSSIER' and COLUMN_NAME <> 'NUM_CC'; CurEnrListeChampsDossier CurListeChampsDossier%ROWTYPE; begin ... PremierChamp := 1; DmlStr1 := 'select '; DmlStr2 := ' (select '; -- Parcours des champs de la table DOSSIER. OPEN CurListeChampsDossier; begin LOOP FETCH CurListeChampsDossier into CurEnrListeChampsDossier; EXIT WHEN CurListeChampsDossier%NOTFOUND; if(PremierChamp = 1) then DmlStr1 := DmlStr1 || ' decode(T1.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, T2.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 1)'; DmlStr2 := DmlStr2 || ' decode(DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', HIST_DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, 1) as ' || CurEnrListeChampsDossier.COLUMN_NAME; PremierChamp := 0; else DmlStr1 := DmlStr1 || ', decode(T1.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, T2.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 1)'; DmlStr2 := DmlStr2 || ', decode(DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', HIST_DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, 1) as ' || CurEnrListeChampsDossier.COLUMN_NAME; end if; END LOOP; CLOSE CurListeChampsDossier; exception when OTHERS then CLOSE CurListeChampsDossier; raise_application_error(-20008, 'Erreur curseur CurListeChampsDossier (' || CurEnrListeChampsDossier.COLUMN_NAME || ' - ' || length(DmlStr1) || ' - ' || length(DmlStr2) || '): ' || SQLERRM); end;
Ma question est donc :
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 -- Ajout de la ligne de modification. begin DmlStr := 'insert into HIST_MODIF_DOSSIER ('; DmlStr := DmlStr || DmlStr1 || ' from'; DmlStr := DmlStr || DmlStr2; DmlStr := DmlStr || ' from DOSSIER, HIST_DOSSIER'; DmlStr := DmlStr || ' where DOSSIER.NUM_CC = ' || :NEW.NUM_CC; DmlStr := DmlStr || ' and DOSSIER.NUM_CC = HIST_DOSSIER.NUM_CC'; DmlStr := DmlStr || ' and ID_HIST_DOSSIER = (select max(ID_HIST_DOSSIER) from HIST_DOSSIER where NUM_CC = ' || :NEW.NUM_CC || ')) T1'; DmlStr := DmlStr || ', '; DmlStr := DmlStr || DmlStr2; DmlStr := DmlStr || ' from DOSSIER, HIST_DOSSIER'; DmlStr := DmlStr || ' where DOSSIER.NUM_CC = ' || :NEW.NUM_CC; DmlStr := DmlStr || ' and DOSSIER.NUM_CC = HIST_DOSSIER.NUM_CC'; DmlStr := DmlStr || ' and ID_HIST_DOSSIER = 1) T2'; DmlStr := DmlStr || ' )'; execute immediate DmlStr; exception when OTHERS then raise_application_error(-20009, 'Erreur ajout HIST_MODIF_DOSSIER (UPDATING): [' || length(DmlStr) || ' - ' || (length(DmlStr1) + length(DmlStr2) + length(DmlStr2)) || '] ' || SQLERRM); end; end if;
Que puis-je utiliser comme type chaîne plus grand pour stocker ma requête ?
Je suis preneur de toute idée ...
![]()
Partager