OCI: "связь" с Oracle-овым типом DATE

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

30 окт 2007, 15:18

Кто-нибудь может сказать КАК (и возможно ли вообще), КАКОЙ тип данных C++ можно использовать в OCIBindByPos и OCIDefineByPos к колонке с оракловым типом DATE ?

Некоторое время искал по документации, но так ничего и не удалось найти.
В итоге пришлось идти "через Альпы", т.е. с помощью преобразование нужных дата+время в/из строковый вид.

То есть, писать, например, так:

Код: Выделить всё

acInsertOP [] =
    "Insert into DB values ("to_date ( :D ATE_STR_1, 'DD.MM.YYYY HH24:MI:SS')";
Затем связывать через OCIBindByPos переменную : DATE_STR_1 со строковым буфером (т.е. указывать тип данных SQLT_STR).

А перед выполнением оператора заполнять этот бувер датой+временем в символьном виде.

В обратную сторону (т.е. читать оракловую колотку типа DATE) та же фигня. Выводить в виде, к примеру, to_char (<date>, 'DD.MM.YYYY') а затем уже выцарапывать из строки по позициям нужные числа.

То есть, есть ли способ указать в OCIBindByPos и OCIDefineByPos какой-нибудь C-шный нестроковый тип данных для более удобных чтения/записи в/из оракловых таблиц данных из колонки DATE?

Заранее спасибо.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

31 окт 2007, 15:59

Нашел.

В C-программе это тип OCIDate.
В OCIDefineByPos тип указывать как SQLT_ODT

Например, для получения текущего времени на оракловом сервере с помощью SQL-оператора:
select sysdate from DUAL

Выполнял привязку:

Код: Выделить всё


OCIDate ocidateOraSysTime;

Result = OCIDefineByPos (
       p_sqlstmtGetSysTime,
       &p_dfn, p_err,
       1, //  ColumnNumber,
       (dvoid*) (&ocidateOraSysTime), // TargetValuePtr,
       sizeof (ocidateOraSysTime), // BufferLength,
       SQLT_ODT, // TargetType,
       (dvoid*) 0,
       0,
       (ub2 *)0, OCI_DEFAULT);
OCIDate - структура, где все значения (день/месяц/год/часы/минуты/секунды) можно просто взять из соответсвующих полей, либо воспользоваться функциями
OCIDateGetDate(),
OCIDateGetTime()
Ответить