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 数据类型很难使用。解决此问题的一种方法是创建一个函数以将约束的搜索条件作为 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 回答