You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中执行DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS后如何查看错误详情

使用DBMS_REDEFINITION为Oracle表添加分区的问题与解决

操作流程与初始问题

我采用创建中间表+DBMS_REDEFINITION API的方式,为Oracle现有表添加分区,初始操作步骤如下:

首先创建空的中间表:

CREATE TABLE my_schema.interm_tb AS SELECT * FROM my_schema.original_tb WHERE 1 = 0;

-- 为中间表添加分区

随后执行重定义脚本,输出显示num_errors > 0,但以SYS用户执行select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS;时,无法查询到具体错误详情。执行的脚本如下:

DECLARE
         num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.start_redef_table('my_schema', 'original_tb', 'interm_tb');
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('my_schema', 'original_tb', 'interm_tb',
                                                        DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE,
                                                        num_errors);
  DBMS_OUTPUT.put_line('num_errors=' || num_errors);
END;

错误排查与解决步骤

查看具体错误信息

将COPY_TABLE_DEPENDENTS中的ignore_errors参数从TRUE改为FALSE,重新执行脚本后,即可直接抛出具体错误信息,无需查询视图。

错误原因与修复方案

修改参数后得到如下错误:

DECLARE
*
ERROR at line 1:
ORA-01442: column to be modified to NOT NULL is already NOT NULL
ORA-06512: at "SYS.DBMS_REDEFINITION", line 2304

经分析,中间表通过CREATE TABLE ... AS SELECT语句创建时,已经继承了原表的非空约束,后续调用COPY_TABLE_DEPENDENTS复制依赖项时,会尝试重复添加这些约束,导致冲突。

解决方法:在调用DBMS_REDEFINITION.start_redef_table之前,先删除中间表的所有约束,执行以下代码:

FOR q IN (
                    select 'alter table "' || owner || '"."' || table_name || '" DROP CONSTRAINT "' || CONSTRAINT_NAME || '"' as sql_text
                    from dba_constraints where table_name='interm_tb'
                    )
                    LOOP
                        DBMS_OUTPUT.put_line(q.sql_text);
                        EXECUTE IMMEDIATE q.sql_text;
                END LOOP;

执行完成后,再运行重定义脚本即可解决该错误。


内容的提问来源于stack exchange,提问作者wi2ard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:25:27