оракул выделять в переменную, когда select ничего не возвращает? - PullRequest
4 голосов
/ 26 января 2012
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 ничего не возвращает :))

Ответы [ 2 ]

6 голосов
/ 26 января 2012

Используйте несколько блоков начала / исключения / конца:

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 голосов
/ 26 января 2012

Использовать локальную процедуру:

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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...