2

私の目標は、クエリ (SELECT) を実行し、結果を取得して text として出力することです。クエリはパラメーターとして指定され、たとえばselect * from t.

と を使用するOCIStmtPrepareOCIStmtExecute、クエリの列をOCIParamGetと の系列で記述できますOCIAttrGetOCI_ATTR_DATA_TYPE列の 1 つで = 12 (DATE)を取得するとします。Then OCI_ATTR_DATA_SIZE= 7 -- これは内部 DATE 表現のサイズです。

現在の NLS 設定に関して、この DATE をテキストとして取得したいと考えています。そのために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 で列のテキスト表現の長さを取得することは可能ですか?

4

3 に答える 3

1

属性OCIAttrGetを呼び出すことにより、必要なバッファサイズを決定できます。OCI_ATTR_DISP_SIZEの場合は40、のNUMBER場合は75、のDATE場合はNを返しますVARCHAR2(N)。ヌル終了用に1バイトを追加すれば、準備は完了です。

于 2010-01-19T14:35:38.663 に答える
1

任意の日付の最大バッファ サイズは 75 です。任意の数値の最大バッファ サイズは 42 です。

それが役立つことを願っています。

于 2009-11-27T00:48:04.190 に答える
0

はい-秘訣は、Cでは文字列は実際には文字配列へのポインターであるためchar* mystring = OCIStringPtr(envhp, x);、 x は へのポインターであると言いOCIStringます。文字列の実際のメモリは、バックグラウンドで OCI によってグローバル env に割り当てられます。OCI_OBJECTSQLT_VSTSQLT_STR

于 2011-06-13T21:05:47.673 に答える