我的目标是执行查询(SELECT),获取结果并将它们输出为 text。查询作为参数给出,可以是例如select * from t
。
我使用OCIStmtPrepare
and OCIStmtExecute
,然后我可以用OCIParamGet
和 系列来描述查询的列OCIAttrGet
。假设我得到OCI_ATTR_DATA_TYPE
其中一列的 = 12 (DATE)。Then OCI_ATTR_DATA_SIZE
= 7 -- 这是内部 DATE 表示的大小。
关于当前的 NLS 设置,我想将此日期作为文本获取。为此,我使用OCIDefineByPos
dty = SQLT_STR
。它工作正常,但我还需要提供一个缓冲区来获取。问题是:我需要多大的缓冲区?
显然它取决于NLS_DATE_FORMAT
. 我相信甲骨文知道这个价值:
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 中获取列的文本表示长度?