很多朋友都习惯使用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语句:
thx.