2

我的目标是执行查询(SELECT),获取结果并将它们输出为 text。查询作为参数给出,可以是例如select * from t

我使用OCIStmtPrepareand OCIStmtExecute,然后我可以用OCIParamGet和 系列来描述查询的列OCIAttrGet。假设我得到OCI_ATTR_DATA_TYPE其中一列的 = 12 (DATE)。Then OCI_ATTR_DATA_SIZE= 7 -- 这是内部 DATE 表示的大小。

关于当前的 NLS 设置,我想将此日期作为文本获取。为此,我使用OCIDefineByPosdty = 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 中获取列的文本表示长度?

4

3 回答 3

1

任何日期的最大缓冲区大小为 75。任何数字的最大缓冲区大小为 42。

我希望这会有所帮助。

于 2009-11-27T00:48:04.190 回答
1

您可以通过调用属性OCIAttrGet来确定所需的缓冲区大小。OCI_ATTR_DISP_SIZE它返回 40 NUMBER, 75 DATE, N VARCHAR2(N)。为 Null 终止添加 1 个字节,一切顺利。

于 2010-01-19T14:35:38.663 回答
0

是的 - 诀窍在于,在 C 中,字符串实际上是指向字符数组的指针,所以你会说char* mystring = OCIStringPtr(envhp, x);x 是指向 an 的指针OCIString,你可以通过连接OCI_OBJECTset 并要求 aSQLT_VST而不是 an 来返回它SQLT_STR。字符串的实际内存是由 OCI 在幕后在全局环境中为您分配的。

于 2011-06-13T21:05:47.673 回答