2016-12-22 6 views
2

SELECT句で使用される場合、私は、次のSELECTクエリを実行するためにOCCI(C++ライブラリ)を使用し、Oracle数値精度及び場合、このテーブルを考える

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

を両方ゼロスケール:

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式のタイプは何ですか? aINTとなり、bCHAR[32]となりますか?私は違うと思います。では、型はどのように計算されますか?

+0

[Oracleでは「NUMBER」と「NUMBER(*、0)」は同じですか?](http://stackoverflow.com/questions/28207708/is-number-and-number-0-the-same-イン・オラクル)。役に立つかもしれない。 – badola

+0

@badola:いいえ。このケースは異なります。 – Nawaz

+0

Hm、スケールと精度を明示的に指定せずに 'NUMBER'を表すと思われるのでしょうか? 'number'を返す関数を作成してみましょう。1を返し、2つから選択し、同じ型を取得するかどうかを確認してください。あなたの 'case'質問については、http://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htmを参照してください。すべての' return_expr'は同じデータ型を持つ必要があります。それ以外の場合はora-00932(データ型の不一致)が返されます。 'else NULL'が結果の' case'データ型を妨害している可能性もあります。 – Timekiller

答えて

2

CASEの式では、THENELSE句の式のデータ型が互換性がある必要があります。したがって、THEN句にはNUMBERを、次にELSE句にはDATEまたはVARCHAR2を含めることはできません。

ただし、精度と位取りはデータ型の一部ではありません。テーブルで許容される値については、精度と位取りをという制約と考える方がよいでしょう。 NUMBER(10,2)は、NUMBERと同じデータ型ですが、10桁を超えないようにする必要があります.2桁の小数部用に予約されています。小数点以下2桁以下です。 (その後、5.333を挿入することはできますが、Oracleは自動的にこの数字を丸めて警告にすることはありません。ただし、入力した場合は123456123456となります。挿入は失敗します)。 CASE式のデータ型は、単にNUMBERです。 (なお、オラクルSQLでさえINT制約ある - Oracleは整数演算を行いません!)

NUMBER(0,0)オラクルには存在しません。 CREATE TABLE test (col NUMBER(0,0))にしようとすると、失敗します。エラーメッセージは、精度(最初の数値)が1から38の間でなければならないことを伝えます。したがって、何でもNUMBER(0,0)はバグのように聞こえます。

+0

あなたの答えをありがとう。私は、両方のブランチのタイプに互換性があることを理解しています。しかし、 'THEN'に' NUMBER(10,4) '、' ELSE'に 'NUMBER(5,2)'を使用すると、私の質問は次のようになります。結果の精度/スケールはどうなりますか? Oracleは私に「NUMBER(0,0)」と言っているようですが、意味がありません。 – Nawaz

+1

私は "タイプコード"とあなたが書いている他のすべてのものに精通していません。オラクルはそれをどのように伝えますか?私はいくつかのテストを行いました(私はちょうどあなたのテーブルのdefを使用し、いくつかの値を挿入し、新しいテーブルを "select CASE_EXPRESSION"として作成しました)精度と位取りは0(ゼロの数)ではなくNULLです。おそらく何か、どこかでNULLが0に変わるでしょうか?オラクルではありませんが、私はそうはしません。 – mathguy

+0

CASE式の結果には、あらかじめ決められた精度とスケールがありません!制約として意味があり、データ型の一部ではありません。データ型はOracle NUMBERです。 – mathguy

関連する問題