3

考虑以下场景:

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

我想alter constraintc_type 并在检查约束中添加一个新类型说'g'。

现在要更改一个约束,我们需要删除它并重新创建它,但我只想在它不包含检查类型“g”的情况下删除该约束。

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

如何比较Long数据类型?

4

2 回答 2

3

我认为您的问题不在于该TYPE列是长的,而是该SEARCH_CONDITION列是长user_constraints的。

因此,您可以执行与本文中的答案类似的操作在您的情况下,它可能如下所示:

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'%'

这是一个 sqlfiddle 演示

于 2013-09-30T13:58:28.673 回答
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')
于 2013-09-30T14:14:29.633 回答