Oracle OCI:确定查询列的文本表示的长度
我的目标是执行查询选择、获取结果并将其作为文本输出。查询作为一个参数给出,可以是,例如,从t中选择* 我使用OCISMTPREPARE和OCISMTEXECUTE,然后我可以通过OCIParamGet和一系列OCATTarget来描述查询的列。假设我得到其中一列的OCI\u ATTR\u DATA\u TYPE=12 DATE。然后OCI_ATTR_DATA_SIZE=7——这是内部日期表示的大小 我想以文本形式获取当前NLS设置的日期。为此,我使用了带有dty=SQLT_STR的OCIDefineByPos。它可以正常工作,但我还需要提供一个用于抓取的缓冲区。问题是:我需要多大的缓冲区 显然,它取决于NLS_日期_格式。我相信Oracle知道这个价值:Oracle OCI:确定查询列的文本表示的长度,oracle,oracle-call-interface,Oracle,Oracle Call Interface,我的目标是执行查询选择、获取结果并将其作为文本输出。查询作为一个参数给出,可以是,例如,从t中选择* 我使用OCISMTPREPARE和OCISMTEXECUTE,然后我可以通过OCIParamGet和一系列OCATTarget来描述查询的列。假设我得到其中一列的OCI\u ATTR\u DATA\u TYPE=12 DATE。然后OCI_ATTR_DATA_SIZE=7——这是内部日期表示的大小 我想以文本形式获取当前NLS设置的日期。为此,我使用了带有dty=SQLT_STR的OCIDefi
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
上述所有内容同样适用于数字。
那么,是否可以在OCI中获取列的文本表示长度?任何日期的最大缓冲区大小都是75。任何数字的最大缓冲区大小为42
我希望这会有所帮助。您可以通过调用OCI\u ATTR\u DISP\u size属性的ociatTarget来确定所需的缓冲区大小。它返回40表示数字,75表示日期,N表示VARCHAR2N。为空终止添加1个字节,您就可以开始了。是-诀窍是,在C中,字符串实际上是指向字符数组的指针,因此您可以说char*mystring=OCIStringPtrenvhp,x;其中x是指向OCIString的指针,您可以通过连接OCI_对象集并请求SQLT_VST而不是SQLT_STR来获取该指针。OCI在后台在全局环境中为您分配字符串的实际内存。42?道格拉斯·亚当斯的粉丝说真的,你是怎么得到的?在9.2.0.7中,createtable的相同技巧给了我40分。无论如何,分配最大大小是浪费内存的……我是IBM的一个项目的首席技术架构师,在该项目中,我们使用Oracle对一个产品进行了国际化,它的后端也使用DB2,这就是我们使用的大小。这是在一些关于国际化的Oracle文档中。感谢Nikolai,它比硬编码不同数据类型的最大大小要好。仍然是内存浪费,我想得到NLS参数的实际大小。