Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle OCI:确定查询列的文本表示的长度_Oracle_Oracle Call Interface - Fatal编程技术网

Oracle OCI:确定查询列的文本表示的长度

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

我的目标是执行查询选择、获取结果并将其作为文本输出。查询作为一个参数给出,可以是,例如,从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知道这个价值:

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参数的实际大小。