non il est positionné à 9.0.0
alors essaye ma solution précédente avec le(s) tableau(x)
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
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 : Sélectionner tout - Visualiser dans une fenêtre à part create table test ( champ1 number, champ2 varchar2(50) ) ;
j'espère que ça va t'aider...
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 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 ;
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
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]
Un problème sans solution est un problème mal posé
Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
Lorsque je compile , j'ai le programme s'arrete
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part ... VALUES (VP_Tabl(j));
Code : Sélectionner tout - Visualiser dans une fenêtre à part ... VALUES VP_Tabl(j);
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
Non en fait
Il n'en veut pas non plus !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ... VALUES VP_Tabl(j);
alors essaye aussi d'initialiser le tableau dans sa déclaration :
Code : Sélectionner tout - Visualiser dans une fenêtre à part VP_Tabl VP_TabType := VP_TabType (null);
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
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 ?
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 étapes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 VP_Tabl VP_TabType := VP_TabType(NULL);
sur la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PL/SQL: ORA-00906: Parenthèse de gauche absente
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
J'ai fait le test que tu m'as proposé et en fait j'ai le message suivant .
alors j'ai mis en commentaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2forall i IN VP_Tabl.first..VP_Tabl.last
sinon j'ai aussi essayé ca
et la j'ai l'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
non je ne passe pas par un Bulk collect
OK, alors essaye d'enregistrer le type et le tableau DANS la base...
Code : Sélectionner tout - Visualiser dans une fenêtre à part create or replace type ...
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
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 : 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
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 ;
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !
Yorglaa
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager