使用EXECUTE IMMEDIATE禁用循环约束

时间:2018-04-20 10:18:59

标签: oracle constraints for-in-loop execute-immediate ora-00911

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连接起来以获得相应的约束并禁用它们。

我正在

 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"

如何在任何一种方法中纠正它?

2 个答案:

答案 0 :(得分:0)

您无法使用"使用"在这种情况下。只需连接字符串并执行。

现在,由于这会给您一个错误消息,因此打印您尝试执行的字符串并查看可能导致问题的原因始终是有用的。

   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;

答案 1 :(得分:0)

我找到了根本原因,其中一个约束名称以“_”开头,因此被检测为无效字符。