2012-01-26 8 views
4
declare 
fName varchar2(255 char); 
begin 
SELECT x.constraint_name into fName FROM all_constraints x 
JOIN all_cons_columns c ON 
c.table_name = x.table_name AND c.constraint_name = x.constraint_name 
WHERE x.table_name = 'MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='MY_COLUMN_NAME'; 
if fName is not null THEN 
    execute immediate 'alter table MY_TABLE_NAME drop constraint ' || fName; 
end if; 

SELECT x.constraint_name into fName FROM all_constraints x 
JOIN all_cons_columns c ON 
c.table_name = x.table_name AND c.constraint_name = x.constraint_name 
WHERE x.table_name = 'OTHER_MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='OTHER_MY_COLUMN_NAME'; 
if fName is not null THEN 
    execute immediate 'alter table OTHER_MY_TABLE_NAME drop constraint ' || fName; 
end if; 
end; 

こんにちは@、 私は場合によりと選択し、私がドロップしたいと私は、このような多くのを持っている制約の名前を取得するには上記のコードを使用しています - >ステートメントをドロップします。 私の問題は、もしselectのどれかが何も返さなければ、例外がスローされるということです。私は例外をキャッチすることができますが、 "begin end"構造の終わり(すべてのselect文の後ろにあるので、残りのドロップは決して実行されません)。選択肢が何も返されない場合は、何もドロップしないようにするにはどうすればよいでしょうか?oracleは、選択したときに変数を選択します。

変数を定義し、例外をスローせずにselectから入力する別の方法がある場合は、返される名前がヌルかどうか、私はそれを好むでしょう:)(今のところ、選択したものは何も返さないという場合を除いて、この選択が働いています:)

答えて

6

複数のbegin/exception/endブロックを使用します。

declare 
fName varchar2(255 char); 
begin 
begin 
    SELECT x.constraint_name into fName FROM all_constraints x 
    JOIN all_cons_columns c ON 
    c.table_name = x.table_name AND c.constraint_name = x.constraint_name 
    WHERE x.table_name = 'MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='MY_COLUMN_NAME'; 
exception 
    when no_data_found then 
    fName := null; 
end; 

if fName is not null THEN 
    execute immediate 'alter table MY_TABLE_NAME drop constraint ' || fName; 
end if; 

begin  
SELECT x.constraint_name into fName FROM all_constraints x 
JOIN all_cons_columns c ON 
c.table_name = x.table_name AND c.constraint_name = x.constraint_name 
WHERE x.table_name = 'OTHER_MY_TABLE_NAME' AND x.constraint_type = 'R' AND c.column_name ='OTHER_MY_COLUMN_NAME'; 
exception 
    when no_data_found then 
    fName := null; 
end; 

if fName is not null THEN 
    execute immediate 'alter table OTHER_MY_TABLE_NAME drop constraint ' || fName; 
end if; 
end; 
5

地元の手順を実行します。

declare 

    procedure drop_constraint(i_table_name in varchar2, i_column_name in varchar2) 
    is 
    l_constr_name varchar2(255 char); 
    begin 
    SELECT x.constraint_name into fName FROM all_constraints x 
    JOIN all_cons_columns c ON c.table_name = x.table_name AND c.constraint_name = x.constraint_name 
    WHERE x.table_name = i_table_name AND x.constraint_type = 'R' AND c.column_name = i_column_name; 

    execute immediate 'alter table ' || i_table_name || ' drop constraint ' || l_constr_name; 

    exception 
    when NO_DATA_FOUND then 
     null; -- ignore or print message 
    end drop_constraint; 

begin 
    drop_constraint('MY_TABLE_NAME', 'MY_COLUMN_NAME'); 
    drop_constraint('OTHER_TABLE_NAME', 'OTHER_COLUMN_NAME'); 
end; 
/
関連する問題