3

Oracle 10g データベースに接続するために、Oracle の JDBC シン ドライバ (10.2.0.3) を使用しています。データベースの列に関する情報を取得したいので、ResultSetMetaDataを使用します。必要な最も重要な情報は列の型と長さなので、getColumnTypegetPrecision、およびgetScaleメソッドを使用します。

select * from tablenameのように列タイプが「単純」である場合、単純なクエリ ( ) で機能しますVARCHAR2(50), NUMBER(5), NUMBER(6,2)。より複雑なクエリ ( select count(*) from tablename) または複雑な計算を含むビューに基づくクエリがある場合、メソッドは次のような奇妙な結果を返します。

  • getScale: -127
  • getPrecisiongetScale0の両方
  • getPrecision: -1

oracle.jdbc.J2EE13Compliant接続プロパティを(いくつかの Web ページで提案されているように) に設定すると、 truegetScale=-127 はなくなりますが、それでも 0/0 の結果が返されます。

ほとんどの場合、これらの奇妙な結果に対する回避策を作成する必要がありますが、その前に、少なくとも Oracle の ResultSetMetaData の動作に関する包括的なドキュメントが必要です。たとえば、すべての SQL タイプに対して getPrecision/getScale の意味を持つ巨大なテーブルは素晴らしいでしょう。このようなドキュメントはどこかにありますか?

4

6 に答える 6

1

user_tab_columns別の方法として、またはを照会することもできますall_tab_columns

于 2009-09-11T12:28:48.870 に答える
1

スケール 0 は許容されます。NUMBER(5) は NUMBER(5,0) と同じです。

ただし、精度を定義するときは、1 から 38 までの整数でなければなりません。NUMBER のように未定義の場合、ドライバーは null を返すことができないため、何かを返す必要があります。その場合、ドライバーは 0 を返すことを選択します。

于 2009-09-11T12:30:00.050 に答える
1

ResultSetMetaData に関する包括的なドキュメントはないように思えます。 Oracle® Database JDBC Developer's Guide and Reference 10g Release 2 (10.2)および11g Release 2 (11.2)では、ここに列名と型の例を示していますが、他の側面については扱っていません。

何年も前に誰かがPostgreSQLで同様の問題を抱えていて、パッチを作成しました。おそらく、Oracle はここで同じコードベースを使用しています。

ojdbc14.jar の代わりに ojdbc14 _g .jarを使用してみてください。これは、そのクラスが「javac -g」でコンパイルされ、いくつかのトレース情報が含まれているためです。

新しいドライバを試すこともできます。

于 2009-09-16T09:40:42.677 に答える
1

を使用してrs.getBigDecimal(columnIndex)、大きな小数点から特定の列の精度/スケール値を取得できます。

于 2012-11-27T04:41:58.910 に答える
1

count(*)Oracle は、明示的に宣言されていないため、ビューまたは に基づく型を返すことはできません。ビューの基になるテーブルに応じて、ビューは任意の精度またはスケールを返す可能性があります。

これを克服するには、次のようにクエリまたはビューで型をキャストする必要があります。

select CAST (count(*) AS NUMBER(30))
于 2014-03-12T22:08:24.643 に答える
0

あなたの質問への直接の返信ではありませんが、あなたが言及した回避策:

データベース スキーマをチェックまたは比較するだけでよい場合は、ResultSetMetaData の代わりに、すべてのテーブルをクエリするときに、「データ モデルのリバース エンジニアリング」で説明されているように、Oracle スキーマ情報を使用します。ユーティリティでそれを使用して、そのような情報をテキストにエクスポートしました

于 2009-09-11T12:39:43.790 に答える