2

この表を考えると、

 CREATE TABLE test (
     c01  INT,
     c02  NUMBER(10,5),
     c03  NUMBER(18,10)
 );

OCCI (C++ ライブラリ) を使用して、次の SELECT クエリを実行します。

 select case(c01) when 10 then c02 else c03 end from test;

この場合、取得する型コードは ですOCCI_SQLT_NUMが、精度とスケールはどちらも0です。それ(0精度とスケール)はどういう意味ですか?これはバグですか?

精度/スケールを知らなければ、プログラムを整数または浮動小数点のどちらとして扱うかを決定することができないため、プログラムの型安全性、セマンティクス、および正確性が危険にさらされます。

つまり、式の型は何CASE(x) WHEN y THEN a ELSE bですか? となることができaますか?違うと思う。では、型はどのように計算されるのでしょうか。INTbCHAR[32]

4

1 に答える 1

2

式では、 and句の式のデータ型に互換性がなければなりませんCASE。したがって、句に aを使用してから、句にorを使用することはできません。THENELSENUMBERTHENDATEVARCHAR2ELSE

ただし、精度と位取りはデータ型の一部ではありません。精度と位取りは、テーブルで許可される値に対する制約と考える方が適切です。NUMBER(10,2)は と同じデータ型NUMBERですが、小数部用に予約されている 2 桁を含めて、合計桁数が 10 桁を超えてはならず、小数点以下が 2 桁を超えてはならないという制約があります。(その後、挿入5.333は引き続き機能します-ただし、Oracleはこの数値を列に収まるように警告なしに自動的に丸めます...しかし、入力を与えた場合、123456123456それを適合させる「丸め」がないため、挿入は不合格)。式のデータ型CASEは単純NUMBERです。(ちなみに、Oracle SQL では、偶数INT制約です。- Oracle は整数演算を行いません!!)

NUMBER(0,0)Oracle には存在しません。しようとCREATE TABLE test (col NUMBER(0,0))すると失敗します。エラー メッセージは、精度 (最初の数値) が 1 から 38 の間でなければならないことを示しますNUMBER(0,0)

于 2016-12-22T15:35:16.600 に答える