a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 328|回复: 0

[考试辅导] Oracle9i中取得建表和索引的DDL语句

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
 我们都知道在9i之前,要想获得建表和索引的语句是一件很麻烦的事。我们通常的做法都是通过export with rows=no来得到,但它的输出因为格式的问题并不能直接拿来用。而另一种方法就是写复杂的脚本来查询数据字典,但这对于一稍微复杂的对象,如IOT和嵌套表等,还是无法查到。
; ^' S2 S6 E1 k; v7 }- e' B" w9 v. d/ J1 ]
  从数据字典中获得DDL语句是经常要用的,特别是在系统升级/重建的时候。在Oracle 9i中,我们可以直接通过执行dbms_metadata从数据字典中查处DDL语句。使用这个功能强大的工具,我们可以获得单个对象或整个SCHEMA的DDL语句。最好不过的是因为它使用起来很简单。( l, [1 Q+ B& \7 Y' M% N

; z: [+ V1 |; f- {+ Q  w  1、获得单个表和索引DDL语句的方法:
, j( y! B5 y7 V3 T
) b; w4 m. U0 G- aset heading off;; Y$ [: K, T2 D/ Y0 r* I( {
set echo off;
0 k( {) B4 A8 [& W) {3 Z# z7 aSet pages 999;: C$ E: |* G7 @; K+ A+ `* Y: c
set long 90000;  I4 t5 p5 U6 a  Z8 A. W8 K
spool get_single.sql
7 C: l9 r. R. s+ |5 h: q* H4 _% V. a0 a: jselect dbms_metadata.get_ddl('TABLE','SZT_PQSO2','SHQSYS') from dual;
" a# H/ d0 O; n1 p9 @select dbms_metadata.get_ddl('INDEX','INDXX_PQZJYW','SHQSYS') from dual;
: D! R, g) \, E  I" ~spool off;
1 ~9 V: N: T! r$ K& Y, n  下面是输出。我们只要把建表/索引语句取出来在后面加个分号就可以直接运行了。
8 B! l: x# y3 @7 B" V9 I1 F6 p+ C# }. }9 w- b( e# w
SQL> select dbms_metadata.get_ddl('TABLE','SZT_PQSO2','SHQSYS') from dual;
2 j- B+ k2 x" r; o  H+ @CREATE TABLE "SHQSYS"."SZT_PQSO2" 3 ?$ k7 J# G. q& }, n
( "PQBH" VARCHAR2(32) NOT NULL ENABLE, - L9 d  b& I- [1 W# W
"ZJYW" NUMBER(10,0), - ^& |: x9 l$ J$ {5 P+ D
"CGSO" NUMBER(10,0) NOT NULL ENABLE,
: s! ~) A1 }9 I"SOLS" VARCHAR2(17), 1 }) A5 f' Q# c( a+ t
"SORQ" VARCHAR2(8), : {2 Z' ?" Q# f% c& [/ g+ _* ~8 P
"SOWR" VARCHAR2(8),
2 e8 o0 l) o: S. y6 P"SOCL" VARCHAR2(6),
" J4 D6 w. f- u, i"YWHM" VARCHAR2(10), & d& V: V" O6 x$ e8 T" u- Q* Q
"YWLX" VARCHAR2(6) 6 p  Q/ g# f8 T! |9 N, k" R
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING ! P) \# Y, [& [  t5 x
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
6 m2 g9 B# Z( g$ G" u. QPCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) - W: \6 v1 N) g* ]3 ?) P' C
TABLESPACE "DATA1" ( n. a8 f# u% B$ w- a
: y! ?! @$ J- x+ {) V1 l
SQL> select dbms_metadata.get_ddl('INDEX','INDXX_PQZJYW','SHQSYS') from dual;
: s. s1 @8 J: R; kCREATE INDEX "SHQSYS"."INDXX_PQZJYW" ON "SHQSYS"."SZT_PQSO2" ("ZJYW") ( U+ p* \* y/ i4 P& _
PCTFREE 10 INITRANS 2 MAXTRANS 255 4 u2 B: k/ F0 W/ S% D1 X; s5 \
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
$ }5 m6 S* m$ E: A4 ]PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  R6 w/ f- v/ K# VTABLESPACE "DATA1" * D, ?2 `0 y' [6 t

! j, Y; X. z! q0 C; ZSQL>
: k+ ^, v/ z+ D, f* M8 w5 s/ J1 B( ~/ t
SQL> spool off; / `( F% [1 |. F, y" P
  2、获得整个SCHEMA DDL语句的方法:
5 Y/ g. }) N( r- y% n0 [2 Z
3 i4 \. S% @1 J) X4 \& I5 fset pagesize 0
3 j0 I+ x- }: N+ x; m9 iset long 90000- ?! B' s) W3 C$ g% J$ I
set feedback off
; e# e# |, M" X2 ?$ I; nset echo off 4 e1 X6 w. G; y* A! ?; n4 T# E
spool get_schema.sql % m- `2 k* ?! g% C( a* @
connect shqsys/shqsys@hawk1;
* S& @* n& T' x; E+ h, d! oSELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)+ X7 R2 S! n  \) c
FROM USER_TABLES u;; P# `$ y  c) E& W, U
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name)
: C6 S- ~9 I; o' ^FROM USER_INDEXES u;* c3 {* g& g2 S2 L" Z* \
spool off;
9 l3 N7 Q7 \8 ~0 `+ G+ T  需要注意的是,当我们的表中有外健(参照约束)时,我们需要判别参照表之间的顺序,确保重建时按照合理的顺序进行。你可以通过查询dba_constraints and dba_cons_columns来确定各表之间的顺序,不再详述。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-24 13:52 , Processed in 0.354866 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表