3

Oracle Client 10g (すべてのバージョン)、11gR1 (v11.1.0.6)を呼び出す ODBC API を使用する現在の C++ アプリケーションは、LONG (4 バイト整数) を返します。 SELECT COUNT(*) from tablename

Oracle クライアントを 11gR1 (v11.1.0.7) 以降 (11.2.xy など) に変更すると、同じステートメントが DOUBLE (Oracle NUMBER データ型に相当する 8 バイトの浮動小数点値) を返します。

バックエンド DB は同じバージョンであるため、この Aggregate SQL 関数のデフォルトの動作を long ではなく double を返すように変更したクライアント側の設定 (推定) が必要です。ODBC API呼び出しを介してプログラムで設定するか、Oracleクライアント構成自体で設定できるような設定を見つけたいと思っています。

私もそれを使用しようとしSQL CASTましたINT SELECT CAST(COUNT(*) AS INT) FROM tablename が、それでもDOUBLE(8バイトのフローティングNUMBER)を返します。

注: 私は ODBC を使用しているため、戻り値を LONG としてサポートする一般的な C++ コードを大量に作成しました。これは、ODBC 経由で 10 年間そうしてきた方法です。可能であれば、アプリケーション内で ORACLE 固有のコードを記述することなく、それを維持したいと考えています。

4

1 に答える 1

1

集約関数は をcount返します。INTEGER通常は と呼ばれNUMBER(38,0)ます。Oracle データベースのすべての数値は、OracleNUMBER形式で格納されます。

バイト数:

round((長さ(p)+s)/2)+1

p = 精度;
s = 正数の場合は 0、負数の場合は 1。
0 と負の無限大は 1 バイトを消費し、正の無限大は 2 バイトを消費します。

select round((length(38)+0)/2)+1 from dual; --20 bytes

これを試してください(テストされていません)..

select vsize(count(*)) from tablename;
select dump(count(*)) from tablename;

OCI外部データ型では、データ型の変換/マッピングが可能です。

于 2012-11-11T02:45:21.370 に答える