[英]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.