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

別のアプローチとして、カーソルを使用できます。カーソルからのフェッチ中に、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 に答える
3

あなたの問題は、TYPE列がLONGであることSEARCH_CONDITIONuser_constraintsはなく、LONGであることだと思います。

したがって、この投稿の回答に似たことができます。あなたの場合、次のようになります。

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 に答える