OCI: определить длину текстового представления столбцов запроса - PullRequest
2 голосов
/ 26 ноября 2009

Моя цель - выполнить запрос (SELECT), получить результаты и вывести их в виде текста . Запрос задается как параметр и может быть, например, select * from t.

Я использую OCIStmtPrepare и OCIStmtExecute, тогда я могу описать столбцы запроса с помощью OCIParamGet и серии OCIAttrGet. Предположим, я получил OCI_ATTR_DATA_TYPE = 12 (ДАТА) для одного из столбцов. Тогда OCI_ATTR_DATA_SIZE = 7 - это размер внутреннего представления DATE.

Я хочу получить эту ДАТУ в виде текста в отношении точных настроек NLS. Для этого я использую OCIDefineByPos с dty = SQLT_STR. Это работает хорошо, но мне также нужно предоставить буфер для выборки. Вопрос: какой размер буфера мне нужен?


Очевидно, это зависит от NLS_DATE_FORMAT. Я считаю, что Oracle знает это значение:

SQL> create table x as select to_char(sysdate) d from dual;

Table created.

SQL> select value from nls_session_parameters where parameter='NLS_DATE_FORMAT';

VALUE                                                                           
----------------------------------------                                        
DD.MM.RR                                                                        

SQL> select data_length from dba_tab_columns where table_name='X';

DATA_LENGTH                                                                     
-----------                                                                     
          8                                                                     

Это точная длина. Только когда формат даты маскируется из Oracle (например, функцией), он использует абсолютное максимальное (?) Значение 75:

SQL> create or replace function get_date_format return varchar2 is
  2  begin
  3    return 'DD.MM.RR';
  4  end;
  5  /

Function created.

SQL> create table x as select to_char(sysdate,get_date_format) d from dual;

Table created.

SQL> select data_length from dba_tab_columns where table_name='X';

DATA_LENGTH                                                                     
-----------                                                                     
         75                                                                     

Все вышеперечисленное относится и к NUMBER.
Итак, возможно ли получить длину текстового представления столбца в OCI?

Ответы [ 3 ]

1 голос
/ 19 января 2010

Вы можете определить необходимый размер буфера, вызвав OCIAttrGet для атрибута OCI_ATTR_DISP_SIZE. Возвращает 40 для NUMBER, 75 для DATE, N для VARCHAR2(N). Добавьте 1 байт для нулевого завершения, и вы готовы идти.

1 голос
/ 27 ноября 2009

Максимальный размер буфера для любой даты - 75. Максимальный размер буфера для любого числа - 42.

Надеюсь, это поможет.

0 голосов
/ 14 июня 2011

Да - хитрость в том, что в C строка на самом деле является указателем на массив символов, поэтому вы бы сказали char* mystring = OCIStringPtr(envhp, x);, где x - указатель на OCIString, который можно получить, подключившись с помощью OCI_OBJECT установить и запросить SQLT_VST вместо SQLT_STR. Фактическая память для строки выделяется для вас в глобальном окружении за кулисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...