0

次のような準ブール列を作成します。

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()、文字型を想定しているためであることがわかりましたが、この問題を解決する方法がわかりません。

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

4

3 に答える 3

3

Oracle コメントを使用できます。

COMMENT ON COLUMN foo.bar is 'Boolean';
于 2012-05-11T15:21:20.200 に答える
2

はい、LONG データ型を扱うのは非常に困難です。これを回避する 1 つの方法は、制約の検索条件を 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  ... 
于 2012-05-11T15:18:46.823 に答える
1

アプリケーションによって異なりますが、列のタイプ、スケール、および精度を確認するだけで十分な場合があります。number(1)Oracle データベースでブール値以外に使用される を見たことがないと思います。

于 2012-05-11T16:03:47.953 に答える