是否可以在oracle的alter语句中使用select查询?

时间:2016-08-05 08:38:30

标签: sql oracle alter

我有以下查询将删除约束,因为我不知道约束名称,我通过指定表名和列名从选择查询中获取它。

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

1 个答案:

答案 0 :(得分:0)

您应该查看“Oracle数据库SQL语言参考”,看看“ALTER TABLE”命令在其语法中是否具有在其中包含子查询的能力,而不是。示例 - &gt; http://docs.oracle.com/database/121/SQLRF/statements_3001.htm#SQLRF01001

“alter table”命令,来自提供的链接的“drop_constraint_clause”示例

enter image description here

总结一下,答案是否定的,你不能在“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;