我有以下查询将删除约束,因为我不知道约束名称,我通过指定表名和列名从选择查询中获取它。
ALTER TABLE <CHILD_TABLE_NAME>
DROP CONSTRAINT in (SELECT
CONS.CONSTRAINT_NAME
FROM USER_CONSTRAINTS CONS
LEFT JOIN USER_CONS_COLUMNS COLS ON COLS.CONSTRAINT_NAME = CONS.CONSTRAINT_NAME
LEFT JOIN USER_CONSTRAINTS CONS_R ON CONS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
LEFT JOIN USER_CONS_COLUMNS COLS_R ON COLS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
WHERE CONS.CONSTRAINT_TYPE = 'R'
AND COLS.COLUMN_NAME='<COLUMN_NAME>'
AND CONS.TABLE_NAME = '<CHILD_TABLE_NAME>')
当我在上面运行查询时,在pl / sql developer
中获得以下错误ORA-02250:missing or invalid constraint name
答案 0 :(得分:0)
您应该查看“Oracle数据库SQL语言参考”,看看“ALTER TABLE”命令在其语法中是否具有在其中包含子查询的能力,而不是。示例 - &gt; http://docs.oracle.com/database/121/SQLRF/statements_3001.htm#SQLRF01001
“alter table”命令,来自提供的链接的“drop_constraint_clause”示例
总结一下,答案是否定的,你不能在“alter table”命令中指定子查询。
您可以做的是使用动态SQL作为@J。 Chomel指定。
示例:
BEGIN
FOR i in (<<YOUR SELECT>>)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||i.TABLE_NAME||' DROP CONSTRAINT '||i.CONSTRAINT_NAME;
END LOOP;
END;