Сергей К.
Дата: 31.05.2006 18:07:12
Здравствуйте.
Попользовавшись OCI, наступил на такие грабли:
для запроса, скажем "select * from somebase" до исполнения Statementa требуется с помощью OCIDefineByPos предопределить fetch-буфер для первой строки результата запроса, который будет использован при вызове OCIStmtExecute.
Если этого не сделать, то последующий OCIStmtExecute выдаст: "ORA-24374: не сделаны определения перед извлечением или выполнением с извлечением".
Представим что ни размеров ни типов ни, даже количества полей в строке результата такого SQL запроса, мне заранее не известно.
Подобную информацию можно получить только после успешного выполнения OCIStmtExecute. Для этого надо скормить какого-то размера буфер хотябы под одно поле. Но, даже если поле резлуьтата в него поместится - я теряю первую строку результата.
Как этого избежать?
Как заставить клиента не фетчить первую строку без явного вызова OCIStmtFetch?
Либо как получить информацию о полях результата (имя/размер/тип) до вызова OCIStmtExecute?
Отключение pre-fetchа не помогает.
Можно, конечно дублировать каждый запрос (после первого выяснять состав выборки), но уж больно не оптимально это.
Клиент: Oracle 8i Client Release 3 (8.1.7)
mcureenab
Дата: 31.05.2006 18:25:50
OCIStmtExecute()
iters (IN)
For non-SELECT statements, the number of times this statement is executed is equal to iters - rowoff.
For SELECT statements, if iters is nonzero, then defines must have been done for the statement handle. The execution fetches iters rows into these predefined buffers and prefetches more rows depending upon the prefetch row count. If you do not know how many rows the SELECT statement will retrieve, set iters to zero.