2013-09-30 50 views
3

考虑以下情形:比较VARCHAR数据长的数据类型在Oracle

CREATE TABLE test 
(
    name VARCHAR2(50), 
    type LONG, 
    CONSTRAINT c_type CHECK (type IN ('a', 'b', 'c', 'd', 'e', 'f')) 
); 

我想alter constraint c_type并添加检查约束的新型说“G”。

现在要改变一个约束条件,我们需要删除它并重新创建它,但是只有当它不包含'g'类型的检查时,我才想删除约束条件。

我检查了表user_constraints,它包含列search_condition,但这里的问题是列“type”的数据类型是long,我无法与varchar进行比较。

如何比较Long数据类型?

+0

也许这篇文章可以给你一些想法http://stackoverflow.com/questions/15918240/oracle-comparing-default-value-of-a-column –

+0

你要扩展或收缩定期列出要素列表还是一次性任务? –

+0

@NicholasKrasnov现在是它的一次性任务,但添加类型的块将定期执行,所以出于这个原因,我想避免执行该块。 – eatSleepCode

回答

3

我认为你的问题不是TYPE列是长,但SEARCH_CONDITIONuser_constraints是一个长。

所以,你可以做类似于this post答案的东西,在你的情况下,它可以是这样的:

select count(*) 
from 
(SELECT XMLTYPE(
DBMS_XMLGEN.GETXML('select SEARCH_CONDITION from user_constraints ') 
).extract('//SEARCH_CONDITION/text()').getstringval() srch_cond 
from dual) 
where srch_cond like '%'g'%' 

Here is a sqlfiddle Demo

+0

'%' g '%'我不知道如何设置搜索条件,您能解释一下吗? – eatSleepCode

+0

由于我使用'DBMS_XMLGEN.GETXML'将long转换为varchar2,所以它被“xml转义”,所以每个'''变成'''。您只能运行内部查询并查看结果 –

+0

我在sqldeveloper上执行相同的操作,但它要求为APOS输入替代值,然后它会给出ORA-31011:XML解析失败错误。 – eatSleepCode

3

作为另一种方法,你可以使用光标 - PL/SQL转换是LONG数据类型VARCHAR2数据类型而从游标中读取值:

set serveroutput on; 
declare 
    cursor c_cursor is 
    select search_condition as sc 
     from user_constraints 
    where constraint_name = 'C_TYPE'; 

    l_list varchar2(4000); 
begin 
    /* 
     As long as you are querying user_constraints data dictionary view, 
     specifying constraint name 
     you guarantee that the only one row will be returned. 

    */ 
    for i in c_cursor 
    loop 
    l_list := i.sc; 
    end loop; 
    dbms_output.put_line(l_list); 
end; 

结果:

anonymous block completed 
col in ('a', 'b','c','d','e','f')