Может ли подзапрос использоваться в заявлении Oracle ALTER?

Учитывая имя таблицы и имя столбца, я пытаюсь динамически удалить ограничение Oracle, которое я не знаю заранее.

Я могу найти имя ограничения с этим запросом:

SELECT CONSTRAINT_NAME 
 FROM USER_CONS_COLUMNS 
 WHERE TABLE_NAME = 'MyTable' AND 
 COLUMN_NAME='MyColumn' AND POSITION IS NULL

Моя первая мысль заключалась в использовании подзапроса, но это не работает и приводит к ошибке ORA-02250:

ALTER TABLE MyTable 
  DROP CONSTRAINT (
   SELECT CONSTRAINT_NAME 
    FROM USER_CONS_COLUMNS 
    WHERE TABLE_NAME = 'MyTable' AND 
    COLUMN_NAME='MyColumn' AND POSITION IS NULL)

До сих пор единственным рабочим решением, которое у меня было, является следующее, но оно кажется излишне сложным:

DECLARE 
statement VARCHAR2(2000);
constr_name VARCHAR2(30);
BEGIN
  SELECT CONSTRAINT_NAME INTO constr_name 
   FROM USER_CONS_COLUMNS 
   WHERE table_name  = 'MyTable' AND 
   column_name = 'MyColumn' AND position is null;
   statement := 'ALTER TABLE MyTable DROP CONSTRAINT '|| constr_name;
   EXECUTE IMMEDIATE(statement); 
END;
/

Есть ли способ сделать это с помощью подзапроса, как я и предполагал? Если нет, может ли кто-нибудь предложить более сжатый способ сделать это?

Ответ 1

Вы не можете. SQL и DDL - это в основном два разделенных языка. Ваше решение верно.

Ответ 2

Чтобы удалить несколько контрольных ограничений...

declare
i number;
begin
for I in (select CONSTRAINT_NAME from USER_CONS_COLUMNS B where B.CONSTRAINT_NAME in (
select a.constraint_name from USER_CONSTRAINTS a where a.TABLE_NAME = 'MAHI' and a.CONSTRAINT_TYPE = 'C')
AND B.COLUMN_NAME in ('EMP_NAME','EMP_SAL')) 
LOOP
EXECUTE IMMEDIATE('alter table DIM_CHR_LOV DROP CONSTRAINT '|| I.CONSTRAINT_NAME);
end LOOP;
end;

Ответ 3

DECLARE 
  statement VARCHAR2(2000);

  cursor foraneas is
    SELECT cc.constraint_name as nombre_contraint, cc.table_name as nombre_tabla
    from all_constraints c, all_cons_columns cc
    where  c.constraint_name = cc.constraint_name
      and cc.table_name 'YourTableName' and cc.column_name = 'yourColumName';
BEGIN

  for r_foranea in foraneas loop
     statement := ' ALTER TABLE '||r_foranea.nombre_tabla||' drop constraint '|| r_foranea.nombre_contraint;
     dbms_output.put_line(statement);
     EXECUTE IMMEDIATE(statement); 
   end loop;
END;