Oracle 11g中DBMS_METADATA.GET_DDL丢失VARCHAR2(4000)列默认值问题
Oracle 11g中VARCHAR2(4000)列默认值丢失的原因
问题场景
在Oracle 11g环境中执行以下操作后,发现VARCHAR2(4000)列的默认值丢失:
- 创建包含超长默认值的表:
CREATE TABLE "TEST1"."JWTEST" ( C0 NUMBER(38) not null PRIMARY KEY, C1 VARCHAR2(4000) DEFAULT 'abcd...(total 4000 characters)...abcd', SUPPLEMENTAL LOG DATA (ALL) COLUMNS );
- 通过
DBMS_METADATA.GET_DDL获取表的DDL:
SELECT DBMS_METADATA.GET_DDL('TABLE', 'JWTEST', 'TEST1') FROM DUAL;
返回的DDL中C1列的默认值丢失:
CREATE TABLE "TEST1"."jwtest2" ( "C0" NUMBER(38,0) NOT NULL ENABLE, "C1" VARCHAR2(4000) DEFAULT , PRIMARY KEY ("C0") USING INDEX ENABLE );
原因分析
这是Oracle 11g版本中DBMS_METADATA.GET_DDL函数的已知缺陷:
- 当VARCHAR2列的默认值长度达到该类型在11g中的最大限制(4000字符)时,函数无法正确解析和输出这个超长默认值,导致生成的DDL中默认值部分为空。
- 补充日志的配置不是直接诱因,但结合超长默认值的场景,触发了该函数的解析异常。
可通过缩短默认值长度(如改为3999字符)验证:此时执行GET_DDL会正常返回完整的默认值定义。
内容的提问来源于stack exchange,提问作者NOknow
相关产品推荐
相关产品推荐

