2016-08-05 22 views
0

私は制約名を知らなかったので、制約を削除する次のクエリを持っています。テーブル名と列名を指定してselectクエリから取得しています。oracleのalter文でselect queryを使用することはできますか?

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>') 

私はあなたが「ALTER TABLE」がコマンドが持っているかどうかを確認するための「Oracle Database SQL言語リファレンス」をチェックアウトする必要があり、PL/SQL開発者

ORA-02250:missing or invalid constraint name 
+4

次の2つのステップでそれを行う必要があるでしょう。最初に制約名を見つけてから、制約を削除します。 – jarlh

+1

このようにすることはできません。 ***動的SQL ***でこれを行う必要があります。 'EXECUTE IMMEDIATE'ステートメントの例を探します。 –

答えて

0

に以下のエラーを取得して、クエリの上に走っていますその構文でサブクエリを持つことはできません。例 - >http://docs.oracle.com/database/121/SQLRF/statements_3001.htm#SQLRF01001

enter image description here

はすべてを総括するに提供されたリンクからのコマンド、「drop_constraint_clause」例「の表を変更する」、答えは、サブクエリで指定していないことができない "ではありませんalter table "コマンドを使用します。

できることは、@ Jとして動的SQLで行うことです。 Chomelが指定されました。

例:

BEGIN 

    FOR i in (<<YOUR SELECT>>) 
    LOOP 
     EXECUTE IMMEDIATE 'ALTER TABLE '||i.TABLE_NAME||' DROP CONSTRAINT '||i.CONSTRAINT_NAME; 
    END LOOP; 

END; 
関連する問題