我想动态删除一个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;
/
有没有一种方法可以使用子查询来完成这个任务,就像我最初想的那样?如果没有,有人能建议一种更简洁的方式吗?