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から入力する別の方法がある場合は、返される名前がヌルかどうか、私はそれを好むでしょう:)(今のところ、選択したものは何も返さないという場合を除いて、この選択が働いています:)