Bonjour,

Oracle 9.2.0.6
Serveur Sun/Solaris OS: SunOS5.7

je suis face à un comportement de Oracle qui me semble incohérent et je souhaiterais savoir si vous avez déjà vu ce genre de comportement :

Explication :
j'ai un code en PL qui exécute un curseur avec un paramètre.
ce curseur contient un Select assez couillu avec des Full Outer Join.

Problème :
Si j'exécute la procédure avec le curseur AVEC le paramètre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
cursor cTest (nContract_i Number) is
Select ...
Begin
Open cTest (1702) ;
Fetch...
End ;
mon code échoue avec un erreur ora 907 - Missing right parenthesis

alors que si je fais la même chose SANS le paramètre, en codant en dur ma valeur (1702) dans le Select du curseur, tout se passe sans aucun problème, le bon résultat est ramené...

PAR CONTRE, sur une base identitique mais sur un serveur Windows 2000, aucun problèmes, même avec le curseur paramètré...

Est-ce que quelqu'un a déjà eu/vu ça ?

à tout hasard, je vous met le code de test... mais le Select est assez long :
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
Declare
 
    cursor cTest (nContract_i Number) is
        Select
                nvl(PRESENT.OBJECT_I, PAST.OBJECT_I) OBJECT_I
                , nvl(PRESENT.Charge, PAST.Charge) Charge
                , nvl(PRESENT.FLEXTYPOLOGYCLASSITEM_I, PAST.FLEXTYPOLOGYCLASSITEM_I) FLEXTYPOLOGYCLASSITEM_I
                , nvl(PRESENT.Address, PAST.Address) Address
                , nvl(PRESENT.SLocality, PAST.SLocality) SLocality
                , nvl(PRESENT.Area_i, PAST.Area_i) Area_i
                , nvl(PRESENT.AppartNum, PAST.AppartNum) AppartNum
        From    (
                	Select
                        Upper(FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_L) || Lpad(To_Char(COL.LODGE_I),5,'0') OBJECT_I
                		, CO.Charge Charge
                		, FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_I
                		, nvl(RPAD(Address1,Length(Address1)-nvl(LENGTH(substr(Address1,InStr(Address1,','))),LENGTH(Address1))),Address1) Address
                		, Locality.SLOCALITY
                		, Area.Area_I
                		, AppartNumber.Appart AppartNum
                        , CO.Contract_i
                	from   contractObject CO
                		, ContractObjectLodge COL
                		, LodgeType LT
                		, FlexTypologyClassMatrix
                		, FlexTypologyClassMatrixValue
                		, FlexTypologyClassItem
                		, Lodge
                		, Area
                		, Locality
                		, (
                        	Select
                                    'n°' ||LTRIM(RTRIM(REPLACE(AOCVAlue,CHR(0))))  Appart
                        		    , Lodge.Lodge_I
                        	From	FTCCharacteristic
                        			, AsylumObjectCharacteristic
                        			, FlexTypologyClassItem
                        			, Lodge
                        	Where	FTCCharacteristic.T_AsylumObject_I = 3237 -- T_AsylumObject_ipar.fGetFlexTypologyClassItem_I(T_AsylumObject_ipar.fIsLODGE)
                        	And 	FTCCharacteristic.T_FlexTypologyClass_I = 146
                        	And 	FTCCharacteristic.FTCCharacteristic_I = AsylumObjectCharacteristic.FTCCharacteristic_I
                        	And 	AsylumObjectCharacteristic.Object_I = Lodge.Lodge_I
                        	And 	AsylumObjectCharacteristic.T_FlexTypologyClassItem_I = FlexTypologyClassItem.FlexTypologyClassItem_I
                        	And 	FlexTypologyClassItem.FlexTypologyClassItemInt_I = 10001
                            And     to_date('01102006','ddmmyyyy') between AsylumObjectCharacteristic.DateFrom and nvl(AsylumObjectCharacteristic.DateTo, to_date('01102006','ddmmyyyy'))
        	              )     AppartNumber
                	Where  CO.contract_I = nContract_i
                	And    Lodge.Lodge_I = COL.Lodge_i
                	And    COL.CONTRACTOBJECT_I = CO.CONTRACTOBJECT_I
                	And    LT.LODGE_I = COL.LODGE_I
                	And    to_date('01102006','ddmmyyyy') between LT.DateFrom And Nvl(LT.DateTo, to_date('01102006','ddmmyyyy'))
                	And    to_date('01102006','ddmmyyyy') between CO.DateFrom and Nvl(CO.DateTo, to_date('01102006','ddmmyyyy'))
                	And		FlexTypologyClassMatrix.FlexTypologyClass_IX = 49 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_Lodge_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClass_IY = 335 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_LocalizationPrefix_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClassMatrix_I = FlexTypologyClassMatrixValue.FlexTypologyClassMatrix_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IX = LT.T_LODGE_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IY = FlexTypologyClassItem.FlexTypologyClassItem_I
                	And 	Lodge.Lodge_I = AppartNumber.Lodge_I(+)
                	And	Area.Area_I = Lodge.Area_I
                	And 	Locality.Locality_I = Area.Locality_I
                )       PRESENT
                Full Outer Join
                (
                	Select
                        Upper(FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_L) || Lpad(To_Char(COL.LODGE_I),5,'0') OBJECT_I
                		, CO.Charge Charge
                		, FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_I
                		, nvl(RPAD(Address1,Length(Address1)-nvl(LENGTH(substr(Address1,InStr(Address1,','))),LENGTH(Address1))),Address1) Address
                		, Locality.SLOCALITY
                		, Area.Area_I
                		, AppartNumber.Appart AppartNum
                        , CO.Contract_i
                	from   contractObject CO
                		, ContractObjectLodge COL
                		, LodgeType LT
                		, FlexTypologyClassMatrix
                		, FlexTypologyClassMatrixValue
                		, FlexTypologyClassItem
                		, Lodge
                		, Area
                		, Locality
                		, (
                        	Select
                                    'n°' ||LTRIM(RTRIM(REPLACE(AOCVAlue,CHR(0))))  Appart
                        		    , Lodge.Lodge_I
                        	From	FTCCharacteristic
                        			, AsylumObjectCharacteristic
                        			, FlexTypologyClassItem
                        			, Lodge
                        	Where	FTCCharacteristic.T_AsylumObject_I = 3237 -- T_AsylumObject_ipar.fGetFlexTypologyClassItem_I(T_AsylumObject_ipar.fIsLODGE)
                        	And 	FTCCharacteristic.T_FlexTypologyClass_I = 146
                        	And 	FTCCharacteristic.FTCCharacteristic_I = AsylumObjectCharacteristic.FTCCharacteristic_I
                        	And 	AsylumObjectCharacteristic.Object_I = Lodge.Lodge_I
                        	And 	AsylumObjectCharacteristic.T_FlexTypologyClassItem_I = FlexTypologyClassItem.FlexTypologyClassItem_I
                        	And 	FlexTypologyClassItem.FlexTypologyClassItemInt_I = 10001
                            And     to_date('01102006','ddmmyyyy') between AsylumObjectCharacteristic.DateFrom and nvl(AsylumObjectCharacteristic.DateTo, to_date('01102006','ddmmyyyy'))
        	              )     AppartNumber
                	Where  CO.contract_I = nContract_i
                	And    Lodge.Lodge_I = COL.Lodge_i
                	And    COL.CONTRACTOBJECT_I = CO.CONTRACTOBJECT_I
                	And    LT.LODGE_I = COL.LODGE_I
                    And    LT.DateFrom = (
                                            Select  max(LT2.DateFrom)
                                            From    LodgeType LT2
                                            Where   LT2.Lodge_i = Lodge.Lodge_i
                                         )
                	And     CO.DateTo = (
                                            Select  max(CO2.DateTo)
                                            From    ContractObject  CO2
                                            Where   CO.Contract_i = CO2.Contract_i
                                        )
                	And		FlexTypologyClassMatrix.FlexTypologyClass_IX = 49 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_Lodge_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClass_IY = 335 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_LocalizationPrefix_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClassMatrix_I = FlexTypologyClassMatrixValue.FlexTypologyClassMatrix_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IX = LT.T_LODGE_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IY = FlexTypologyClassItem.FlexTypologyClassItem_I
                	And 	Lodge.Lodge_I = AppartNumber.Lodge_I(+)
                	And	    Area.Area_I = Lodge.Area_I
                	And 	Locality.Locality_I = Area.Locality_I
                )       PAST
                On PRESENT.Contract_i = PAST.Contract_i
        UNION
        Select
                nvl(PRESENT.OBJECT_I, PAST.OBJECT_I) OBJECT_I
                , nvl(PRESENT.Charge, PAST.Charge) Charge
                , nvl(PRESENT.FLEXTYPOLOGYCLASSITEM_I, PAST.FLEXTYPOLOGYCLASSITEM_I) FLEXTYPOLOGYCLASSITEM_I
                , nvl(PRESENT.Address, PAST.Address) Address
                , nvl(PRESENT.SLocality, PAST.SLocality) SLocality
                , nvl(PRESENT.Area_i, PAST.Area_i) Area_i
                , nvl(PRESENT.AppartNum, PAST.AppartNum) AppartNum
        From    (
                	Select
                        Upper(FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_L) || Lpad(To_Char(COO.OFFICE_I),5,'0') OBJECT_I
                		, CO.Charge Charge
                		, FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_I
                		, nvl(RPAD(Address1,Length(Address1)-nvl(LENGTH(substr(Address1,InStr(Address1,','))),LENGTH(Address1))),Address1) Address
                		, Locality.SLOCALITY
                		, Area.Area_I
                		, null AppartNum
                        , CO.Contract_i
                	from   contractObject CO
                		, ContractObjectOffice COO
                		, OfficeType OT
                		, FlexTypologyClassMatrix
                		, FlexTypologyClassMatrixValue
                		, FlexTypologyClassItem
                		, Office
                		, Area
                		, Locality
                	Where  CO.contract_I = nContract_i
                	And    COO.CONTRACTOBJECT_I = CO.CONTRACTOBJECT_I
                	And    OT.OFFICE_I = COO.Office_I
                	And    to_date('01102006','ddmmyyyy') between OT.DateFrom and Nvl(OT.DateTo, to_date('01102006','ddmmyyyy'))
                	And    to_date('01102006','ddmmyyyy') between CO.DateFrom and Nvl(CO.DateTo, to_date('01102006','ddmmyyyy'))
                	And	    FlexTypologyClassMatrix.FlexTypologyClass_IX = 48 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_Office_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClass_IY = 335 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_LocalizationPrefix_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClassMatrix_I = FlexTypologyClassMatrixValue.FlexTypologyClassMatrix_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IX = OT.T_OFFICE_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IY = FlexTypologyClassItem.FlexTypologyClassItem_I
                	And	    Area.Area_I = Office.Area_I
                	And 	Locality.Locality_I = Area.Locality_I
                	And 	Office.OFFICE_I = COO.Office_I
                )       PRESENT
                Full Outer Join
                (
                	Select
                        Upper(FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_L) || Lpad(To_Char(COO.OFFICE_I),5,'0') OBJECT_I
                		, CO.Charge Charge
                		, FlexTypologyClassItem.FLEXTYPOLOGYCLASSITEM_I
                		, nvl(RPAD(Address1,Length(Address1)-nvl(LENGTH(substr(Address1,InStr(Address1,','))),LENGTH(Address1))),Address1) Address
                		, Locality.SLOCALITY
                		, Area.Area_I
                		, null AppartNum
                        , CO.Contract_i
                	from   contractObject CO
                		, ContractObjectOffice COO
                		, OfficeType OT
                		, FlexTypologyClassMatrix
                		, FlexTypologyClassMatrixValue
                		, FlexTypologyClassItem
                		, Office
                		, Area
                		, Locality
                	Where  CO.contract_I = nContract_i
                	And    COO.CONTRACTOBJECT_I = CO.CONTRACTOBJECT_I
                	And    OT.OFFICE_I = COO.Office_I
                    And    OT.DateFrom = (
                                            Select  max(OT2.DateFrom)
                                            From    OfficeType OT2
                                            Where   OT2.Office_i = Office.Office_i
                                         )
                	And     CO.DateTo = (
                                            Select  max(CO2.DateTo)
                                            From    ContractObject  CO2
                                            Where   CO.Contract_i = CO2.Contract_i
                                        )
                	And	    FlexTypologyClassMatrix.FlexTypologyClass_IX = 48 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_Office_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClass_IY = 335 -- FlexTypologyClassSel.fGetFlexTypologyClass_I( T_FlexTypologyClass_IPar.fIsT_LocalizationPrefix_I )
                	And 	FlexTypologyClassMatrix.FlexTypologyClassMatrix_I = FlexTypologyClassMatrixValue.FlexTypologyClassMatrix_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IX = OT.T_OFFICE_I
                	And 	FlexTypologyClassMatrixValue.FlexTypologyClassItem_IY = FlexTypologyClassItem.FlexTypologyClassItem_I
                	And	    Area.Area_I = Office.Area_I
                	And 	Locality.Locality_I = Area.Locality_I
                	And 	Office.OFFICE_I = COO.Office_I
                )       PAST
                On PRESENT.Contract_i = PAST.Contract_i
        UNION
        Select
                nvl(PRESENT.OBJECT_I, PAST.OBJECT_I) OBJECT_I
                , nvl(PRESENT.Charge, PAST.Charge) Charge
                , nvl(PRESENT.FLEXTYPOLOGYCLASSITEM_I, PAST.FLEXTYPOLOGYCLASSITEM_I) FLEXTYPOLOGYCLASSITEM_I
                , nvl(PRESENT.Address, PAST.Address) Address
                , nvl(PRESENT.SLocality, PAST.SLocality) SLocality
                , nvl(PRESENT.Area_i, PAST.Area_i) Area_i
                , nvl(PRESENT.AppartNum, PAST.AppartNum) AppartNum
        From    (
                	Select
                        Lpad(To_Char(COA.AREA_I),5,'0') OBJECT_I
                		, CO.Charge Charge
                		, 0 FLEXTYPOLOGYCLASSITEM_I
                		, nvl(RPAD(Address1,Length(Address1)-nvl(LENGTH(substr(Address1,InStr(Address1,','))),LENGTH(Address1))),Address1) Address
                		, Locality.SLOCALITY
                		, Area.Area_I
                		, null AppartNum
                        , CO.Contract_i
                	from   contractObject CO
                		, ContractObjectArea COA
                		, Area
                		, Locality
                	Where   CO.contract_I = nContract_i
                	And     COA.CONTRACTOBJECT_I = CO.CONTRACTOBJECT_I
                	And     to_date('01102006','ddmmyyyy') between CO.DateFrom and Nvl(CO.DateTo, to_date('01102006','ddmmyyyy'))
                	And	    Area.Area_I = COA.Area_I
                	And 	Locality.Locality_I = Area.Locality_I
                )       PRESENT
                Full Outer Join
                (
                	Select
                        Lpad(To_Char(COA.AREA_I),5,'0') OBJECT_I
                		, CO.Charge Charge
                		, 0 FLEXTYPOLOGYCLASSITEM_I
                		, nvl(RPAD(Address1,Length(Address1)-nvl(LENGTH(substr(Address1,InStr(Address1,','))),LENGTH(Address1))),Address1) Address
                		, Locality.SLOCALITY
                		, Area.Area_I
                		, null AppartNum
                        , CO.Contract_i
                	from   contractObject CO
                		, ContractObjectArea COA
                		, Area
                		, Locality
                	Where   CO.contract_I = nContract_i
                	And     COA.CONTRACTOBJECT_I = CO.CONTRACTOBJECT_I
                	And     CO.DateTo = (
                                            Select  max(CO2.DateTo)
                                            From    ContractObject  CO2
                                            Where   CO.Contract_i = CO2.Contract_i
                                        )
                	And	    Area.Area_I = COA.Area_I
                	And 	Locality.Locality_I = Area.Locality_I
                )       PAST
                On PRESENT.Contract_i = PAST.Contract_i ;
 
 
        cTestRow                cTest%RowType ;
 
Begin
 
    Open cTest (1702) ;
    Fetch cTest into cTestRow ;
    Close cTest ;
 
    DBMS_OUTPUT.PUT_LINE ( 'OK' );
 
    Exception
    When Others
    Then
        DBMS_OUTPUT.PUT_LINE ( SQLERRM );
 
End ;