2016-08-05 22 views
0

我有以下查詢將刪除約束,因爲我不知道約束名稱,我通過指定表名和列名從選擇查詢中獲取它。有沒有可能在oracle的alter語句中使用select查詢?

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開發

ORA-02250:missing or invalid constraint name 
+4

你必須做的兩個步驟。首先找到約束名稱,然後刪除約束。 – jarlh

+1

這不能這樣做。你必須用***動態SQL ***來做到這一點;查找「EXECUTE IMMEDIATE」語句示例。 –

回答

0

你應該看看「Oracle數據庫SQL語言參考」,看看「ALTER TABLE」命令在它的語法中有一個子查詢的能力,但事實並非如此。示例 - >http://docs.oracle.com/database/121/SQLRF/statements_3001.htm#SQLRF01001

從所提供的鏈接

enter image description here

總之所有的「ALTER TABLE」命令,「drop_constraint_clause」舉例來說,答案是,你不能有一個子查詢中沒有指定「改變表「命令。

你可以做的是用動態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; 
相關問題