Моя цель - выполнить запрос (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?