我尝试禁用所有数据库表的所有约束。该数据库名为“database_test”。性能不是问题。
我写了一个pl / sql脚本,它给了我表的所有约束。
我的问题是:当我运行脚本时,SQL开发人员会说“ORA-00972:标识符太长”。但我只使用数据库中已定义的字段。
CREATE OR REPLACE PROCEDURE DISPLAY_CONSTRAINT_DATABASE AS
BEGIN
FOR i IN (SELECT DISTINCT OWNER, OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' AND OWNER = 'DB_NAME')
LOOP
FOR j IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE owner = i.OWNER AND table_name = i.OBJECT_NAME AND CONSTRAINT_TYPE='R')
LOOP
dbms_utility.exec_ddl_statement('alter table "DB_NAME.' || i.OBJECT_NAME || ' DISABLE CONSTRAINT ' || j.CONSTRAINT_NAME);
END LOOP;
END LOOP;
END DISPLAY_CONSTRAINT_DATABASE;
答案 0 :(得分:3)
你的双引号错了。您正在生成如下的SQL语句:
alter table "DB_NAME.FOOBAR disable constraint some_constraint;
哪个错过了第二个双引号(我的猜测是你可能想把之后的第二个引号放在表名之后也是错误的。)
您需要将标识符的每个部分都放在引号中,而不是整个内容:
alter table "DB_NAME"."FOOBAR" disable constraint some_constraint;
我也没有看到使用dbms_sql的必要性:
execute immediate 'alter table "DB_NAME"."' || i.OBJECT_NAME || '" DISABLE CONSTRAINT ' || j.CONSTRAINT_NAME;
为避免重复拥有者,我实际上会将语句更改为:
execute immediate 'alter table "'||j.owner||'"."' || i.OBJECT_NAME || '" DISABLE CONSTRAINT ' || j.CONSTRAINT_NAME;
因此,您只需要在程序中对所有者名称进行“硬编码”。