76{
78 Field::__queryHandle = _queryHandle;
80 __sqlt = _sqlt;
81
82 OCIParam* param =
NULL;
83 sword status = OCIParamGet(
84 query()->stmtHandle(),
85 OCI_HTYPE_STMT,
86 conn()->errorHandle(),
87 (dvoid**)¶m,
88 _position
89 );
90 if (status != OCI_SUCCESS) {
92 return false;
93 }
94
96 ub4 size = 0;
97 status = OCIAttrGet(
98 param,
99 OCI_DTYPE_PARAM,
100 &name,
101 &size,
102 OCI_ATTR_NAME,
103 conn()->errorHandle()
104 );
105 if (status != OCI_SUCCESS) {
107 return false;
108 }
109
110 try {
111 Field::__name = UTF8Decoder::decode((const char*)name, size);
112 }
113 catch (CharsetConvertException* _e) {
116 return false;
117 }
118
119 sb2 precision = 0;
120 size = sizeof(precision);
121 status = OCIAttrGet(
122 param,
123 OCI_DTYPE_PARAM,
124 &precision,
125 &size,
126 OCI_ATTR_PRECISION,
127 conn()->errorHandle()
128 );
130 if (status != OCI_SUCCESS) {
132 return false;
133 }
134
135 sb1 scale = 0;
136 size = sizeof(scale);
137 status = OCIAttrGet(
138 param,
139 OCI_DTYPE_PARAM,
140 &scale,
141 &size,
142 OCI_ATTR_SCALE,
143 conn()->errorHandle()
144 );
146 if (status != OCI_SUCCESS) {
148 return false;
149 }
150
151 Field::__precision = precision;
152 Field::__scale = scale;
153
154#ifdef __DCL_DEBUG
155
156
157 ub4 dataSize = 0;
158 size = sizeof(dataSize);
159 status = OCIAttrGet(
160 param,
161 OCI_DTYPE_PARAM,
162 &dataSize,
163 &size,
164 OCI_ATTR_DATA_SIZE,
165 conn()->errorHandle()
166 );
168 if (status != OCI_SUCCESS) {
170 return false;
171 }
174#endif
175
179 switch(_sqlt) {
180 case SQLT_NUM: {
182
183
186 break;
187 }
188 case SQLT_IBFLOAT: {
192 break;
193 }
194 case SQLT_IBDOUBLE: {
198 break;
199 }
200 case SQLT_DAT: {
204 break;
205 }
206 case SQLT_TIMESTAMP: {
210 break;
211 }
212 case SQLT_TIMESTAMP_TZ: {
216 break;
217 }
218 case SQLT_TIMESTAMP_LTZ: {
222 break;
223 }
224 case SQLT_INTERVAL_YM: {
228 break;
229 }
230 case SQLT_INTERVAL_DS: {
234 break;
235 }
236 case SQLT_RDD: {
237
238
239
240
244 break;
245 }
246 case SQLT_CHR: {
249 break;
250 }
251 case SQLT_AFC: {
254 break;
255 }
256 case SQLT_BIN: {
259 break;
260 }
261 case SQLT_LNG: {
266 break;
267 }
268 case SQLT_LBI: {
273 break;
274 }
275 case SQLT_CLOB: {
279 break;
280 }
281 case SQLT_BLOB: {
285 break;
286 }
287 case SQLT_CFILE: {
291 break;
292 }
293 case SQLT_BFILE: {
297 break;
298 }
299 default: {
300#ifdef __DCL_DEBUG
302#else
304 return false;
305#endif
306 }
307 }
308
309#if 0
310
311
312
313
314
315 if (_position > 2) {
317 return false;
318 }
319#endif
320
323
328 );
329 if (status != OCI_SUCCESS) {
331 return false;
332 }
333 }
334
335 OCIDefine* defnp =
NULL;
337 status = OCIDefineByPos(
338 query()->stmtHandle(),
339 &defnp,
340 conn()->errorHandle(),
349 );
350 }
351 else {
352
353 status = OCIDefineByPos(
354 query()->stmtHandle(),
355 &defnp,
356 conn()->errorHandle(),
365 );
366 if (status == OCI_SUCCESS) {
367 status = OCIDefineDynamic(
368 defnp,
369 conn()->errorHandle(),
370 this,
372 );
373 }
374 }
375 if (status != OCI_SUCCESS) {
377 return false;
378 }
379
380 return true;
381}
#define __DCL_TRACE5_N(fmt, arg1, arg2, arg3, arg4, arg5)
sword DescriptorAlloc(void **_descpp, ub4 _type, size_t _xtramem_sz=0, void **_usrmempp=NULL)
virtual OciQuery * query() const =0
static sb4 defineCallback(dvoid *_octxp, OCIDefine *_defnp, ub4 _iter, dvoid **_bufpp, ub4 **_alenpp, ub1 *_piecep, dvoid **_indpp, ub2 **_rcodepp)