私の目標は、クエリ (SELECT) を実行し、結果を取得して text として出力することです。クエリはパラメーターとして指定され、たとえばselect * from t
.
と を使用するOCIStmtPrepare
とOCIStmtExecute
、クエリの列をOCIParamGet
と の系列で記述できますOCIAttrGet
。OCI_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 で列のテキスト表現の長さを取得することは可能ですか?