很多朋友都习惯使用PL/SQL Developer图形化工具的快捷View SQL功能获取数据库中对象的创建DDL语句信息,这种方式的优点是要比使用DBMS_METADATA.GET_DDL函数方便许多,但使用View SQL功能却有着潜在的隐患,如下例:

SQL> drop table tv;
Table dropped.

SQL> create table tv (t1 int) tablespace users parallel;
Table created.

/* 为tv表指定了parallel为DEFAULT DEGREE */

接着在PL/SQL DEVELOPER中CTRL+左键点击TV可以进入TV对象的属性界面,点击View SQL可以看到PL/SQL DEVELOPER生成的DDL语句:

-- Create table
create table TV
(
  T1 INTEGER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

/* 可以看到PLSQL DEVELOPER生成的DDL语句未包含Parallel属性!*/

/* 利用DBMS_METADATA.GET_DDL可以获取到完整的DDL语句 */

SQL> set serveroutput on;

SQL> declare
  res varchar2(500);
begin
  res := dbms_metadata.get_ddl(object_type => 'TABLE',
                               name        => 'TV',
                               schema      => 'SYS');
  dbms_output.put_line(res);
end;
/

CREATE TABLE "SYS"."TV"
("T1" NUMBER(*,0))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
PARALLEL 

/* 不仅于parallel属性,在PL/SQL Developer Version 8.0.0.1480中生成的建表DDL语句也不包含NOLOGGING属性 */

SQL> alter table tv nologging;
Table altered.

/*View SQL功能生成的DDL语句 */
-- Create table
create table TV
(
  T1 INTEGER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  )
compress;

/* 使用DBMS_METADATA.GET_DDL可以正确表达NOLOGGING属性 */

  CREATE TABLE "SYS"."TV"
   (	"T1" NUMBER(*,0)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 COMPRESS NOLOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"
  PARALLEL

不过幸运的是PLSQL DEVELOPER工具也包含了DBMS_METADATA->DDL选项可以调用该函数返回准确的DDL语句:

© 2010, www.oracledatabase12g.com. 版权所有.文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.

相关文章 | Related posts:

  1. Script:Generate A DDL Script For A Table
  2. Oracle SQL Developer 的一个Bug
  3. 内部视图:interval view x$kvii 介绍
  4. A Close Look at Oracle8i Data Block Internals
  5. VIEW: X$KTUXE – Transaction Entry (table)
  6. VIEW:X$KCCRS-Controlfile Record Section directory (8.0 – 8.1)
  7. Rollback Segment Utilization:Extent, Wrap and Shrink
  8. How to Cancel a Refresh Operation of a Materialized View (MV)

1 comment to PL/SQL Developer View SQL功能的一个Bug

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>