簡體   English   中英

使用EXECUTE IMMEDIATE禁用循環約束

[英]Use EXECUTE IMMEDIATE to disable constraint in loop

FOR k IN (SELECT UC.CONSTRAINT_NAME, UC.TABLE_NAME FROM USER_CONSTRAINTS UC, TMP_DATA_MIG TDM
WHERE UC.TABLE_NAME = TDM.TABLE_NAMES AND UC.CONSTRAINT_TYPE IN('R','C','U')) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||k.TABLE_NAME||' DISABLE CONSTRAINT '||k.CONSTRAINT_NAME||' CASCADE';
END LOOP;

在FOR..IN循環上方,將TMP_DATA_MIG中的那些表名稱與USER_CONSTRAINTS TMP_DATA_MIG在一起,以獲取其對應的約束並禁用它們。

我正進入(狀態

 ORA-00911  "invalid character"

我試圖用綁定變量寫它

FOR k IN (SELECT UC.CONSTRAINT_NAME, UC.TABLE_NAME FROM USER_CONSTRAINTS UC, TMP_DATA_MIG_TABLE_LIST TDM WHERE UC.TABLE_NAME = TDM.TABLE_NAMES AND UC.CONSTRAINT_TYPE IN('R','C','U')) LOOP
l_sql := 'ALTER TABLE :TABLE_NAME DISABLE CONSTRAINT :CONSTRAINT_NAME CASCADE';  
 EXECUTE IMMEDIATE l_sql USING k.TABLE_NAME,k.CONSTRAINT_NAME;
 END LOOP;

上面的代碼得到ORA-00903 "invalid table name"

如何以任何一種方法糾正它?

在這種情況下,您不能使用“使用”。 只需連接字符串並執行。

現在,由於這會給您一條錯誤消息,因此打印要嘗試執行的字符串並查看可能導致問題的原因總是有用的。

   for k in (select uc.constraint_name
                   ,uc.table_name
               from user_constraints        uc
                   ,tmp_data_mig_table_list tdm
              where uc.table_name = tdm.table_names
                and uc.constraint_type in ('R', 'C', 'U'))
   loop
      l_sql := 'ALTER TABLE '||k.table_name||'  DISABLE CONSTRAINT '||k.constraint_name||' CASCADE';
      dbms_output.put_line(l_sql);
      execute immediate l_sql;
   end loop;

我找到了根本原因,其中一個約束名稱以“ _”開頭,因此被檢測為無效字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM