Можно ли использовать подзапрос в операторе Oracle ALTER? - PullRequest
14 голосов
/ 06 мая 2011

Учитывая имя таблицы и имя столбца, я пытаюсь динамически отбросить ограничение 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;
/

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

Ответы [ 2 ]

17 голосов
/ 06 мая 2011

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

0 голосов
/ 07 ноября 2014

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

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