2012-05-11 22 views
0

私はこのような準ブール列を作成:Oracle:列が "ブール値"かどうかを判断する方法

CREATE TABLE foo 
    bar NUMBER(1) DEFAULT 0 NOT NULL CHECK (hide IN (0, 1)) 

私は現在user_tab_columnsをこすることだし、与えられた列がブール値であるかどうかを判断できるようにしたいと思います。これまでのところ、私はこれ持っている:

SELECT column_name, 
     (SELECT COUNT(*) 
     FROM all_constraints 
     WHERE table_name = table_name 
     AND constraint_type = 'C' 
     AND REGEXP_LIKE(search_condition, '^ *' || column_name || ' +IN *\(*0, *1 *\) *$', 'i')) is_boolean 
FROM user_tab_columns; 

をしかし、私は次のエラーを取得しています:

ORA-00932: inconsistent datatypes: expected NUMBER got LONG 
00932. 00000 - "inconsistent datatypes: expected %s got %s" 
*Cause:  
*Action: 
Error at Line: 6 Column: 31 

私はsearch_conditionデータ型がLONGであるためであることを学んだ、とREGEXP_LIKE()を期待しました文字の種類が、この問題を解決する方法がわかりません。

これは正しい方法ですか?もしそうなら、どうすればエラーを解決できますか?そうでない場合は、これを行うためのより良い方法は何ですか?

+0

私はお詫び申し上げます、スタックオーバーフローは私に提出と編集でエラーを与えています。これは本当の質問でした。私は誓います:( – FtDRbwLXw6

+0

私の 'CREATE TABLE'クエリを包み込んだ'( '') 'のように思われません... ???? – FtDRbwLXw6

+0

個人的に私はCHAR IMO番号は、CHARフィールドがそうでないように誤用されがちです。YMMV。 –

答えて

3

あなたは、Oracleのコメントを使用することができます。

COMMENT ON COLUMN foo.bar is 'Boolean'; 
2

はい、LONGデータ型は非常に扱いにくいです。このラウンド一つの方法は、VARCHAR2として制約の検索条件を返すように関数を作成することです:

create or replace 
function search_condition 
(p_owner varchar2 
, p_constraint_name varchar2 
) return varchar2 
is 
    l_text long; 
begin 
    select search_condition into l_text from all_constraints 
    where owner = p_owner 
    and constraint_name = p_constraint_name; 
    return l_text; 
end; 

今すぐあなたのクエリでこれを使用することができます。

select constraint_name, search_condition from 
(
select constraint_name, search_condition (owner, constraint_name) search_condition 
from all_constraints 
where constraint_type = 'C' 
and owner = 'TONYEOR' 
) 
where ... 
1

これはアプリケーションによって異なりますが、列の種類、位取り、精度は十分です。私は今までnumber(1)がOracleデータベースのブール値に使用されているとは思っていません。

+0

私はこのケースを持っています;)(そして、私は絶対に大丈夫ですそれは恐ろしい選択だという事実)。しかし、あなたの答えは現在有効なようです。たとえば、.Net用のDevartコネクタはブール型のすべての数値(1)を変換します。 –

+0

残念ながら、これは私のアプリケーションにとっては安全ではありません。非ブール型データを持つ複数のNUMBER(1)列があります。 – FtDRbwLXw6

関連する問題