Oracle:如何确定列是否是“布尔”?

时间:2012-05-11 15:01:27

标签: sql oracle boolean

我创建了这样的准布尔列:

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()需要字符类型,但我不确定如何解决此问题。< / p>

我是以正确的方式来做这件事的吗?如果是这样,我该如何解决我得到的错误?如果没有,有什么更好的方法呢?

3 个答案:

答案 0 :(得分:3)

您可以使用Oracle评论:

COMMENT ON COLUMN foo.bar is 'Boolean';

答案 1 :(得分: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  ... 

答案 2 :(得分:1)

这取决于您的应用程序,但查看列类型,比例和精度可能就足够了。我不认为我曾经见过number(1)用于除Oracle数据库中的布尔之外的任何东西。

相关问题