non il est positionné à 9.0.0
Version imprimable
non il est positionné à 9.0.0
alors essaye ma solution précédente avec le(s) tableau(x)
Je ne suis pas trop une pro des tableaux mais bon vu la situation ....
Merci pour ton aide ...
voici un petit exemple tout simple :
une table test :
et un petit code d'insertion avec un tableau :Code:create table test ( champ1 number, champ2 varchar2(50) ) ;
j'espère que ça va t'aider...Code:
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 Declare -- type du tableau type testTabType is table of test%RowType ; -- tableau avec son initialisation testTab testTabType := testTabType (Null) ; -- No d'index des item du tableau idx number := 0 ; Begin -- pour commencer "propre", on vide le tableau pour commencer testTab.delete ; -- chargement du tableau, 1ère ligne idx := idx + 1 ; -- on incrémente l'index des item testTab.extend ; -- on étend le tableau d'une ligne testTab(idx).champ1 := 100 ; -- valeur à donner à la colonne champ1 de la table test testTab(idx).champ2 := 'première ligne' ; -- valeur à donner à la colonne champ1 de la table test --------------------------------------------------- -- chargement du tableau, 2ème ligne idx := idx + 1 ; -- on incrémente l'index des item testTab.extend ; -- on étend le tableau d'une ligne testTab(idx).champ1 := 200 ; -- valeur à donner à la colonne champ1 de la table test testTab(idx).champ2 := 'deuxième ligne' ; -- valeur à donner à la colonne champ1 de la table test --------------------------------------------------- -- insertion (en une seule fois) du tableau dans la table test forall j in testTab.first .. testTab.last insert into test values testTab(j) ; Commit ; End ;
Si tu veux des exemples d'utilisations des tableaux :
http://sheikyerbouti.developpez.com/...?page=Chap5#L5
[EDIT] Désolé Yorglaa, quand j'ai posté, je n'ai pas vu ta réponse ;) [/EDIT]
Lorsque je compile , j'ai le programme s'arrete
Code:
1
2
3
4 forall j IN VP_Tabl.first .. VP_Tabl.last INSERT INTO T_ANOMAL VALUES (VP_Tabl(j)); COMMIT ;
et génére le message suivant :
Code:
1
2 PL/SQL: ORA-00947: Nombre de valeurs insuffisant
Pourtant la déclaration effectuée me semble bonne :
Que se passe t-il ?Code:
1
2
3
4 TYPE VP_TabType IS TABLE OF T_ANOMAL%ROWTYPE ; VP_Tabl VP_TabType; VP_idx NUMBER ;
salut,
dans l'insert, le tableau ne doit pas être entre parenthèses...
faux :
juste :Code:... VALUES (VP_Tabl(j));
Code:... VALUES VP_Tabl(j);
Non en fait
Il n'en veut pas non plus !!!Code:
1
2 ... VALUES VP_Tabl(j);
alors essaye aussi d'initialiser le tableau dans sa déclaration :
Code:VP_Tabl VP_TabType := VP_TabType (null);
en relisant ces posts, je me pose une question et j'ai un souvenir qui revient à moi...
La question:
Est-ce que tu as essayé de mettre les test de la base distante dans une procédure autonome indépendante ? (si tenté que ce soit tolérable fonctionnellement...)
Le souvenir:
J'ai des collègues qui avaient soufferts longtemps sur le même genre de problème sur un gros projet. Finalement, ils avaient mis en place une solution à base de tableaux. C'est à dire qu'il y avait une procédure "chapeau" qui était chargée d'appeler les autres procédures avec à chaque fois le passage d'un tableau en paramètre (out ou in/out). Chaque procédure dirigeait tous ses messages dans le tableau, puis la procédure chapeau inscrivait à la fin le contenu du tableau dans une table oracle de traces. Une fois ce principe mis en place, tout roule...
Une autre chose me vient aussi à l'esprit :
comme on initialise le tableau avec RowType, TOUTES les colonnes de la table T_ANOMAL sont présentes dans ce tableau...
alors est-ce tu affecte bien une valeur (même Null si il le faut) pour CHAQUE colonne du tableau avant l'insert ?
effectivement je n'initialise pas le tableau ... j'essayerai demain et vous tient au courant ....
merci.
Lorsque je déclare mes variables publiques dans mon package
J'ai le message suivant :Code:
1
2
3
4 TYPE VP_TabType IS TABLE OF T_ANOMAL%ROWTYPE; VP_idx NUMBER ; VP_Tabl VP_TabType := VP_TabType(NULL);
donc j'ai découpé ça en 2 étapesCode:
1
2PLS-00492: l'initialisation de variable ou de constante ne peut pas se référer à des fonctions déclarées dans le même package
mes variables publiques dans mon package
et dans ma procédure qui execute mon traitement des anomalies je déclare:Code:
1
2
3
4 TYPE VP_TabType IS TABLE OF T_ANOMAL%ROWTYPE; VP_idx NUMBER ; VP_Tabl VP_TabType ;
Mais cela ne résoud pas mon problème j'ai toujours le message d'erreur suivant :Code:
1
2 VP_Tabl VP_TabType := VP_TabType(NULL);
sur la ligneCode:
1
2 PL/SQL: ORA-00906: Parenthèse de gauche absente
Code:
1
2 INSERT INTO T_ANOMAL VALUES VP_Tabl(j);
à priori je dirais que le message d'erreur (parenthèses) laisse supposer qu'il manque une parenthèse AILLEURS dans le code (plus haut), ce qui décale les ouverture - fermetures de parenthèses et ne te met pas le message en relation avec la bonne ligne...
essaye de commenter ton insert et de faire autre chose à la place (select sysdate into xxx from dual par exemple) pour voir si tu as toujours ce message pour une autre ligne de ton code...
J'ai fait le test que tu m'as proposé et en fait j'ai le message suivant .
alors j'ai mis en commentaireCode:
1
2PLS-00435: L'instruction DML sans BULK In-BIND ne peut pas être utilisée dans un FORALL
et là je n'ai plus de probleme ?!! Je vais pété un plomb ...Code:
1
2forall i IN VP_Tabl.first..VP_Tabl.last
sinon j'ai aussi essayé ca
et la j'ai l'erreurCode:
1
2
3
4 FORALL i IN VP_Tabl.FIRST..VP_Tabl.LAST INSERT INTO T_ANOMAL(R_CODPAT, R_FICHIER, R_CHAMPS, R_CODE_REJET, R_NATURE_REJET, R_DATE_REJET) VALUES(VP_Tabl(i).R_CODPAT,VP_Tabl(i).R_FICHIER, VP_Tabl(i).R_CHAMPS, VP_tabl(i).R_CODE_REJET, VP_Tabl(i).R_NATURE_REJET, VP_Tabl(i).R_DATE_REJET);
Code:
1
2PLS-00436: restriction de mise en oeuvre : impossible de référencer des champs d'une table d'enregistrements BULK In-BIND
Est-ce que tu charge le tableau via un Bulk collect d'une curseur ?
si oui, tu va devoir passer par une boucle standard (For Loop par exemple) pour le chargement du tableau...
non je ne passe pas par un Bulk collect
OK, alors essaye d'enregistrer le type et le tableau DANS la base...
Code:create or replace type ...
je te mets en plus un exemple d'une procédure de ma base, avec ce type de chargement...
ton erreur c'est à la compilation, ou à l'exécution ?Code:
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
113 Declare Cursor cToLoad is Select SB.SupportBudget_i , SB.SupportBudgetID , GS.SocialGroup_i , SB.TotalAmount , SB.DateFrom , SB.DateTo , SB.DateMakeOut , SB.OrganizationalUnitPost_i , SB.T_SBRequesterCategory_i , SB.T_SupportBudgetInvalidation_i , SB.T_SupportBudgetPayment_i , SB.T_SupportBudgetStatus_i , SB.T_SBInputMode_i , SB.SupportBudgetComment , SB.TotalAlreadyPaidForSupport , SB.TotalAlreadyPaidForSupportInv , SB.TotalIncomeDeducted , SB.TotalIncomeDeductedInv , SB.TotalIncomeProvision , SB.TotalToPayForSupport , SB.TotalToPayForSupportInv , SB.TotalExtraIndemnity , SB.TotalExtraIndemnityInv , SB.TotalExtraDeduction , SB.TotalExtraDeductionInv , SB.TotalIncome , SB.TotalIncomeCalculated , SB.TotalReimbursement From ( Select distinct SG.SocialGroup_i From WVDSocialGroup SG Where SG.VDBillHeader_i = pn_Bill_I And SG.SocialGroup_i not in ( Select distinct E.Object_i From WVDBillError E Where E.VDBillHeader_i = SG.VDBillHeader_i And E.ErrorNumber between 2000 and 2999 --Erreurs "Groupe Social" And E.ErrorNumber != 2001 -- mais pas la 2001 qui est contrôlée A LA FIN de cette procédure And E.Validated = 'N' ) ) GS , SupportBudget SB Where GS.SocialGroup_i = SB.SocialGroup_i And SB.DateFrom between rBillInfo.DateFrom and rBillInfo.DateTo And SB.T_SupportBudgetStatus_i = 2291 ; -- Payé Type rTabType is table of WVDSupportBudget%RowType ; rTab rTabType := rTabType (Null) ; idx Number := 0 ; nSeq Number ; Begin rTab.Delete ; For i in cToLoad Loop idx := idx + 1 ; Select WVDSupportBudget_iSeq.NextVal into nSeq from dual ; rTab.extend ; rTab(idx).WVDSupportBudget_i := nSeq ; rTab(idx).VDBillHeader_i := pn_Bill_I ; rTab(idx).SupportBudget_i := i.SupportBudget_i ; rTab(idx).SupportBudgetID := i.SupportBudgetID ; rTab(idx).SocialGroup_i := i.SocialGroup_i ; rTab(idx).TotalAmount := i.TotalAmount ; rTab(idx).DateFrom := i.DateFrom ; rTab(idx).DateTo := i.DateTo ; rTab(idx).DateMakeOut := i.DateMakeOut ; rTab(idx).OrganizationalUnitPost_i := i.OrganizationalUnitPost_i ; rTab(idx).T_SBRequesterCategory_i := i.T_SBRequesterCategory_i ; rTab(idx).T_SupportBudgetInvalidation_i := i.T_SupportBudgetInvalidation_i ; rTab(idx).T_SupportBudgetPayment_i := i.T_SupportBudgetPayment_i ; rTab(idx).T_SupportBudgetStatus_i := i.T_SupportBudgetStatus_i ; rTab(idx).T_SBInputMode_i := i.T_SBInputMode_i ; rTab(idx).SupportBudgetComment := i.SupportBudgetComment ; rTab(idx).TotalAlreadyPaidForSupport := i.TotalAlreadyPaidForSupport ; rTab(idx).TotalAlreadyPaidForSupportInv := i.TotalAlreadyPaidForSupportInv ; rTab(idx).TotalIncomeDeducted := i.TotalIncomeDeducted ; rTab(idx).TotalIncomeDeductedInv := i.TotalIncomeDeductedInv ; rTab(idx).TotalIncomeProvision := i.TotalIncomeProvision ; rTab(idx).TotalToPayForSupport := i.TotalToPayForSupport ; rTab(idx).TotalToPayForSupportInv := i.TotalToPayForSupportInv ; rTab(idx).TotalExtraIndemnity := i.TotalExtraIndemnity ; rTab(idx).TotalExtraIndemnityInv := i.TotalExtraIndemnityInv ; rTab(idx).TotalExtraDeduction := i.TotalExtraDeduction ; rTab(idx).TotalExtraDeductionInv := i.TotalExtraDeductionInv ; rTab(idx).TotalIncome := i.TotalIncome ; rTab(idx).TotalIncomeCalculated := i.TotalIncomeCalculated ; rTab(idx).TotalReimbursement := i.TotalReimbursement ; End Loop ; If rTab.Exists(1) Then ForAll j in rTab.First .. rTab.Last Insert into WVDSupportBudget Values rTab(j) ; Commit ; End If ; End ;