在oracle中比较长数据类型和varchar数据

时间:2013-09-30 13:12:34

标签: oracle constraints type-conversion check-constraints

请考虑以下情况:

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数据类型?

2 个答案:

答案 0 :(得分:3)

我认为您的问题不在于TYPE列是长的,而SEARCH_CONDITION的{​​{1}}是长的。

所以你可以做一些类似this post中答案的事情,在你的情况下,它可以是这样的:

user_constraints

Here is a sqlfiddle Demo

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