DBMS_METADATA与右键单击“查看”之间的区别

时间:2013-06-14 20:11:39

标签: oracle plsql oracle11g plsqldeveloper

今天发生了一些奇怪的事情,我的朋友(开发人员)说它可能是一个错误......通常当我想在PL / SQL中看到表的DDL时,我右键单击表然后我点击视图然后我得到了DDL。
但是,还有另一种方法可以获取表的DDL,右键单击表,然后有一个名为DBMS_METADATA的东西,然后我把光标放在它上面它会告诉我DDL。在我上传的图像中,DBMS_METADATA和'view'之间存在差异.Number 1表示'view',2表示DBMS_METADATA,如果您注意到两者之间存在巨大差异。第一个显示列organization_code它不为null(因为它未被检查)但第二个显示organization_code为null。这让开发人员感到困惑,他们应该指望哪一个? 。但是在测试列之后它不为空。我应该提一下,列是一个主键,所以它应该是NOT null为什么在medata中显示错误的信息?那之前发生过这种情况吗?(顺便说一句,我使用的是11g)
difference info

1 个答案:

答案 0 :(得分:2)

用于主键的列不能为null 1 。但是,该限制只能通过主键约束来强制执行,并且不需要单独的非空约束。 IDE PL / SQL Developer向您展示了主键约束而非空约束的一般更有用的组合。 DBMS_METADATA正在向您显示指定表的确切方式,除非您计划删除主键,否则这是无关紧要的。

create table table1(a number not null primary key);
create table table2(a number primary key);

begin
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,
        'SEGMENT_ATTRIBUTES',false);
end;
/

select dbms_metadata.get_ddl('TABLE', 'TABLE1') from dual;


  CREATE TABLE "JHELLER"."TABLE1" 
  ( "A" NUMBER NOT NULL ENABLE, 
     PRIMARY KEY ("A") ENABLE
  ) 

select dbms_metadata.get_ddl('TABLE', 'TABLE2') from dual;


  CREATE TABLE "JHELLER"."TABLE2" 
   (    "A" NUMBER, 
     PRIMARY KEY ("A") ENABLE
   )

在PL / SQL Developer中,两列都没有检查Nullable。

1除非您使用未经验证的非唯一索引,这是非常罕见的。