我创建了这样的准布尔列:
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>
我是以正确的方式来做这件事的吗?如果是这样,我该如何解决我得到的错误?如果没有,有什么更好的方法呢?
答案 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数据库中的布尔之外的任何东西。