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;
Привет @,
Я использую приведенный выше код, чтобы получить имена ограничений, которые я хочу удалить, и у меня есть много таких выборок, а затем if -> drop операторов.
Моя проблема в том, что если один из селекторов ничего не возвращает, выдается исключение. Я мог бы поймать исключение, но в конце структуры «begin end» (так что после всех операторов select, так что остальные отбрасывания никогда не будут выполнены). Как мне это устроить, чтобы, если select ничего не возвращал, я просто не хочу ничего отбрасывать:)
Если есть другой способ определить переменную и заполнить ее из select, не выдавая исключение, независимо от того, возвращено ли имя null или нет, я бы предпочел его :) за исключением случая, когда select ничего не возвращает :))