当前位置 博文首页 > LuciferLiu_DBA:12C新特性之 ORA-00972(11G到12C的变化)

    LuciferLiu_DBA:12C新特性之 ORA-00972(11G到12C的变化)

    作者:[db:作者] 时间:2021-06-16 09:12

    一、11G and before

    在使用11G数据库时,经常会遇到报错ORA-00972,原因是因为对象名称定义太长,限制为30位字符.

    
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> create table NUS_DGSGDJD_SDSDWQDD_ADSADAD20210411(ID NUMBER);
    create table NUS_DGSGDJD_SDSDWQDD_ADSADAD20210411(ID NUMBER)
                 *
    ERROR at line 1:
    ORA-00972: identifier is too long
    
    
    SQL> select length('NUS_DGSGDJD_SDSDWQDD_ADSADAD20210411') from dual;
    
    LENGTH('NUS_DGSGDJD_SDSDWQDD_ADSADAD20210411')
    ----------------------------------------------
    					    36
    
    SQL> desc user_tables
     Name					   Null?    Type
     ----------------------------------------- -------- ----------------------------
     TABLE_NAME				   NOT NULL VARCHAR2(30)
     TABLESPACE_NAME				    VARCHAR2(30)
     CLUSTER_NAME					    VARCHAR2(30)
     IOT_NAME					        VARCHAR2(30)
    
    SQL> desc sys.obj$
     Name					   Null?    Type
     ----------------------------------------- -------- ----------------------------
     OBJ#					   NOT NULL NUMBER
     DATAOBJ#					        NUMBER
     OWNER# 				   NOT NULL NUMBER
     NAME					   NOT NULL VARCHAR2(30)
    
    
    [oracle@orcl11g:/home/oracle]$ oerr ORA 00972
    00972, 00000, "identifier is too long"
    // *Cause:  An identifier with more than 30 characters was specified.
    // *Action:  Specify at most 30 characters.

    二、12C and later

    可以看到,在12C之后的版本,Oracle调整对象名称为128位字符,但是密码依然保持30位。

    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.3.0.0.0
    
    SQL> create table NUS_DGSGDJD_SDSDWQDD_ADSADAD20210411(ID NUMBER);
    
    Table created.
    
    SQL> select length('NUS_DGSGDJD_SDSDWQDD_ADSADAD20210411') from dual;
    
    LENGTH('NUS_DGSGDJD_SDSDWQDD_ADSADAD20210411')
    ----------------------------------------------
    					    36
    
    SQL> desc user_tables
     Name					   Null?    Type
     ----------------------------------------- -------- ----------------------------
     TABLE_NAME				   NOT NULL VARCHAR2(128)
     TABLESPACE_NAME				    VARCHAR2(30)
     CLUSTER_NAME					    VARCHAR2(128)
     IOT_NAME					        VARCHAR2(128)
     
    SQL> desc sys.obj$
     Name					   Null?    Type
     ----------------------------------------- -------- ----------------------------
     OBJ#					   NOT NULL NUMBER
     DATAOBJ#					        NUMBER
     OWNER# 				   NOT NULL NUMBER
     NAME					   NOT NULL VARCHAR2(128)
    
    
    [oracle@orcl:/home/oracle]$ oerr ORA 00972
    00972, 00000, "identifier is too long"
    // *Cause:  An identifier with more than 128 bytes was specified,
    //          or a password identifier longer than 30 bytes was specified.
    // *Action:  Specify at most 128 bytes for identifiers,
    //           and at most 30 bytes for password identifiers.

    ?