2008-09-19 6 views
1

Я не могу понять документацию Oracle. :-(Вывод массива Oracle OCI из простых типов данных?

Кто-нибудь знает, как извлечь несколько строк простых данных из Oracle через OCI

Я в настоящее время используется OCIDefineByPos для определения отдельных переменных (мне нужно сделать только для простых чисел - SQLT_INT/4 -байт Интс), а затем принести одну строку за один раз с OCIStmtExecute/OCIStmtFetch2.

Это нормально для небольших объемов данных, но она занимает около .5ms в строке, поэтому при чтении несколько десятков тысяч строк, это слишком

Я просто не понимаю документацию для OCIBindArrayOfStruct. Как я могу получить несколько тысяч строк за раз?

+0

Я вообще не знаю предметной области, но кажется, что этот вопрос был закрыт не по своей сути, а исключительно потому, что (до редактирования) он попросил примеры кода, и это было (с учетом конкретной формулировки) интерпретируется как * примеры кода * вне сайта *, поэтому вопрос задается сторонним запросом ресурса. Это кажется сумасшедшим для меня, поскольку я утверждаю в http: //meta.stackoverflow.com/questions/275063/why-is-my-not-an-answer-flag-marked-helpful-but-not-acted-on # comment267078_275066, и в любом случае (полностью поверхностный) выбор фразы был изменен, поэтому я голосую за возобновление. – 2015-11-05 14:09:29

ответ

2

Вы можете использовать OCIDefineArrayOfStruct для поддержки выборки массивов записей. Вы делаете это, передавая базу массива OCIDefineByPos и используйте OCIDefineArrayOfStruct, чтобы сообщить Oracle о размере записей (размер пропусков). Я считаю, что затем вы вызываете OCIFetch, чтобы сообщить размер массива.

Альтернативой является установка атрибута statement, OCI_ATTR_PREFETCH_ROWS, перед его выполнением. Это говорит Oracle, сколько строк нужно извлекать за раз, по умолчанию оно равно 1. Используя этот подход, Oracle делает меньше округлых поездок и буферов для вас.

OCIBindArrayOfStruct используется с операторами DML. Он работает аналогично OCIDefineArrayOfStruct, за исключением того, что он работает со связующими переменными.

Вы можете найти пример кода на веб-сайте Oracle.

3

Вы просмотрели образец кода в $ ORACLE_HOME/oci/samples (если у вас их нет, затем запустите установщик Oracle и скажите ему установить пример кода). Есть несколько, которые используют объемные интерфейсы.

Возможно, вы захотите серьезно рассмотреть возможность использования библиотеки. Я закодировал Pro * C (ненавижу его), прямой OCI и использовал сторонние библиотеки. Последнее лучшее, с большим отрывом. Синтаксис OCI действительно волосатый и имеет варианты, которые вы, вероятно, никогда не будете использовать. В то же время это очень, очень жестко и приведет к сбою вашего кода, если вы делаете что-то даже немного неправильно.

Если вы используете C++, тогда я могу порекомендовать OTL; Я провел серьезное тестирование производительности, и OTL так же быстро, как и ручное кодирование для общего случая (вы можете победить его на 5-10%, если вы точно знаете, что у вас нет NULL в ваших данных и, следовательно, не нужен индикатор массивы). Примечание. Не пытайтесь понять код OTL. Это довольно отвратительно. Но это работает очень хорошо.

Существует также множество библиотек C, которые обертывают OCI и делают их более пригодными для использования и менее склонны укусить вас, но я не тестировал ни одного из них.

Если ничего другого, сделайте себе одолжение и напишите функции обертки для кода OCI, чтобы упростить задачу. Я сделал это в своем сценарии высокой производительности, и это резко сократило количество проблем, которые у меня были.

+0

Спасибо за ответ. Да, я давно смотрел образцы и не мог найти ничего, что мог бы понять (настойчивость Oracle по отбрасыванию всех гласных от имен и скрытие любой логики кода в массе проверки ошибок и т. Д. Не помогает). Нужно еще раз взглянуть на обертку libs, я думаю ... – 2008-09-19 15:28:25

+0

Код примера действительно, очень беден, глобальные переменные везде и т. Д. Я бы не рекомендовал использовать какие-либо реальные приложения на нем! – Gaius 2011-06-07 06:59:28