Oracle 9i/10g/11gDBMS_METADATA包详细      赵元杰  北京群环域科技有限公司       2012.2
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
关于导出元数据♠ Oracle 对源码OPEN的谨慎:  ♠ 直到 Oracle 9i 为止,Oracle 对开放源代码都很谨慎,过去希望完整列出    自己创建的对象的元数据是困难的  ♠ 到Oracle 9i 时, Oracle 给出DBM...
导出元数据的革命性变化     ♠ 新旧方法比较:               ♠ 在8i及之前版本,从多个数据字典查询并拼接才能形成完整的DDL语                 句:SELECT rem /* 创建表、主键、存储参数及pct...
导出元数据的革命性变化♠ 新旧方法比较:    ♠ 在9i及之后版本得到DDL更简单:SELECT dbms_metadata.get_ddl(‘TABLE’,’EMPLOYEE’)FROM dual;DBMS_METADATA.GET_DDL...
元数据包的权限♠ DBMS_METEDATA:   ♠ DBMS_METADATA 已经授予 PUBLIC:--包属于SYS用户:select * from dba_tab_privswhere table_name = ‘DBMS_METAD...
Oracle 9i/10g/11g-子程序 ♠ DBMS_METADATA 包-9i/10g/11g 差异:       ♠ 不同版本支持的子程序不同:             子程序                         功能   ...
Oracle 9i/10g/11g-子程序 ♠ DBMS_METADATA 包-9i/10g/11g 差异:        ♠ 不同版本支持的子程序不同:         子程序                   功能         9i ...
Oracle 9i/10g/11g-子程序♠ DBMS_METADATA 包-9i/10g/11g 差异:      ♠ 不同版本支持的子程序不同:              子程序                      功能       ...
Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:        ♠ 不同版本支持的类型不同:          类型                  功能        9i   ...
Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:        ♠ 不同版本支持的类型不同:           类型                功能         9i   ...
Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:     ♠ 不同版本支持的类型不同:           类型                    功能   9i   10g  ...
Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:        ♠ 不同版本支持的类型不同:            类型             功能       9i   10g ...
Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:        ♠ 不同版本支持的类型不同:          类型                 功能     9i   10g ...
Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:       ♠ 不同版本支持的类型不同:            类型              功能      9i   10g  ...
Oracle 10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:      ♠ 不同版本支持的类型不同:            类型                 功能      9i   10g   ...
Oracle 10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异:     ♠ 不同版本支持的类型不同:           类型                         功能   9i   10g...
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
DBMS_METADATA使用环境♠ 在SQL*Plus 环境下使用:   ♠ 在PL/SQL中使用包的方法   ♠ 在SQL>下命令使用select * from dba_tab_privswhere table_name = ‘DBMS_M...
DBMS_METADATA使用环境♠ 在SQL*Plus 环境下使用注意:  ♠ 在SQL>下命令使用-大小写敏感问题--类型用大写,比如:dbms_metadata.get_ddl(VIEW,C_VIEW,OE)--错误:参数不能用小写dbm...
DBMS_METADATA使用环境♠ 使用DBMS_METADATA包的权限问题:  ♠ 如果没有授予角色,则提示错误:  ♠ 授予SELECT_CATALOG_ROLE角色--权限不够时的提示GRANT select, insert, upd...
DBMS_METADATA使用环境♠ 使用DBMS_METADATA包的技巧: ♠ 在SQL>下使用,要设置环境参数,如:--常用格式设置:LINESIZE 行宽PAGESIZE 每页行数FEEDBACK OFF 反馈行数的数量LONG 至少设...
DBMS_METADATA.GET_DDL♠ GET_DDL 可导出许多类型对象的元数据:   ♠ 例子1:最简单的用法连接到:Oracle Database 11g Enterprise Edition Release11.2.0.1.0 -...
DBMS_METADATA.GET_DDL♠ GET_DDL 可导出许多类型对象的元数据:   ♠ 例子2:从DBA角度导出某个用户的某个表:SQL> show userUSER 为 "SYSTEM"SQL> select dbms_metad...
DBMS_METADATA.GET_DDL♠ GET_DDL 可导出许多类型对象的元数据:   ♠ 例子3:从DBA角度导出某个用户的某个表:set pagesize 0set linesize 200set long 1000000set l...
DBMS_METADATA.GET_DDL♠ GET_DDL 可导出Procedure:   ♠ 例子4:导出某个procedure:CREATE OR REPLACE PROCEDURE abc ASBEGINNULL;END abc;--S...
DBMS_METADATA.set_transform_param♠ 默认导出结果与转换设置: ♠ 1. PRETTY缩排或换行格式化 ♠ 2. STORAGE {TRUE | FALSE } ♠ 3. SEGMENT_ATTRIBUTES {...
DBMS_METADATA.set_transform_param♠ set_transform_param可对导出结果的格式处理:  ♠ --1.输出信息采用缩排或换行格式化  ♠ EXEC DBMS_METADATA.set_transfo...
DBMS_METADATA.set_transform_param♠ set_transform_param可对导出结果进行格式处理:  ♠ --3.关闭表索引、外键等约束信息  ♠ EXEC DBMS_METADATA.set_transfo...
DBMS_METADATA.set_transform_param♠ set_transform_param可对导出结果进行格式处理:  ♠ --6.关闭存储属性描述:  ♠ EXEC    DBMS_METADATA.set_transfor...
未使用SET_TRANSFORM_PARAM♠ 用SET_TRANSFORM_PARAM 中:   ♠ 使用set_transform_param过程来实现输出子句的控制 SQL> select dbms_metadata.get_ddl(TA...
使用SET_TRANSFORM_PARAM  ♠ 用SET_TRANSFORM_PARAM 中:         ♠ 使用set_transform_param过程来实现输出子句的控制SQL> EXEC DBMS_METADATA.SET_TR...
未使用SET_TRANSFORM_PARAM   ♠ GET_DDL 可导出表的转换:        ♠ 例子5:没有声明转换要求,则直接完全导出:SET LONG 1000000select dbms_metadata.get_ddl(TAB...
使用SET_TRANSFORM_PARAM♠ GET_DDL 可导出表的转换:   ♠ 例子6:先用set_transform_param声明转换:execute dbms_metadata.set_transform_param(dbms_m...
使用SET_TRANSFORM_PARAM♠ GET_DDL 可导出表的转换:   ♠ 例子7:先用set_transform_param声明转换:execute dbms_metadata.set_transform_param(dbms_m...
使用SET_TRANSFORM_PARAM    ♠ GET_DDL 输出信息采用缩排或换行格式化:         ♠ 例子8:EXEC           DBMS_METADATA.set_transform_param(DBMS_MET...
GET_DDL导出Profile     ♠ GET_DDL 可导出PROFILE信息:        ♠ 例子9:用PROFILE类型:SQL> select dbms_metadata.get_ddl(PROFILE,DEFAULT ) f...
GET_DDL导出注释♠ GET_DDL 导出表的注释信息:   ♠ 例子10:用COMMENT类型:--获取表注释SELECT DBMS_LOB.substr(DBMS_METADATA.get_dependent_ddl(COMMENT, ...
GET_DDL导出db_link ♠ GET_DDL 导出DB_LINK信息:    ♠ 例子11:9i用DB_LINK类型(口令时明码):--Oracle 9i@>show userUSER is "TEST"@>create databas...
GET_DDL导出db_link♠ GET_DDL 导出DB_LINK信息:     ♠ 例子12:10g/11g用DB_LINK类型(口令为Hash值):--10g/11gtest@TEST>show userUSER is "TEST"te...
GET_DDL导出同义词♠ 例子13:导出用户同义词脚本: ♠ 自动导出创建同义词批命令: --批量产生再创建同义词的脚本: set pagesize 0 set linesize 200 SET TRIMSPOOL ON set long 1...
GET_DDL导出AQ♠ DBMS_METADATA.get_ddl  ♠ 对象类型-AQ_QUEUE :Select dbms_metadata.get_ddl(AQ_QUEUE,DEF$_AQERROR,SYSTEM)from dual;D...
GET_DDL导出AQ♠ DBMS_METADATA.get_ddl  ♠ 对象类型-AQ_QUEUE_TABLE :SQL> selectdbms_metadata.get_ddl(AQ_QUEUE_TABLE,DEF$_AQERROR,SY...
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
GET_DEPENDENT_DDL♠ 可导出对象依赖关系:    ♠ 使用 GET_DEPENDENT_DDL得到相关的DDL    ♠ 类型不能是TABLESQL> set long 9999SQL> SELECT DBMS_METADATA...
GET_DEPENDENT_DDL ♠ 可导出对象依赖关系:       ♠ 使用 GET_DEPENDENT_DDL得到相关的DDL       ♠ 类型不能是TABLESQL> SELECT DBMS_METADATA.get_depend...
GET_DEPENDENT_DDL♠ 可导出对象依赖关系:    ♠ 使用 GET_DEPENDENT_DDL    ♠ 得到相关的DDLSQL> GRANT select ON emp TO system;授权成功。SQL> GRANT se...
GET_GRANTED_DDL♠ 可用GET_GRANTED_DDL导出权限:  ♠ 使用 GET_GRANTED_DDL 列出系统权限CREATE USER PLSQL_USER IDENTIFIED BY PLSQL_USER;GRANT ...
GET_GRANTED_DDL♠ 可用GET_GRANTED_DDL导出权限:   ♠ 使用 GET_GRANTED_DDL 列出对象权限SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT,PLS...
GET_GRANTED_DDL  ♠ 可用GET_GRANTED_DDL导出权限:     ♠ 使用 GET_GRANTED_DDL 列出DBA拥有的权限SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJECT_G...
GET_GRANTED_DDL♠ 可用GET_GRANTED_DDL导出权限:      ♠ GET_GRANTED_DDL 列出Public拥有的权限SQL> SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJE...
GET_QUERY♠ 可用GET_QUERY 查询对象的信息:  ♠ dbms_metadata.get_query 获得XML元数据;set long 1000000set serveroutput onset pagesize 0set l...
GET_XML♠ 可用GET_XML 查询对象的信息:  ♠ dbms_metadata.get_XML获得XML元数据;  ♠ 与dbms_metadata.get_query有些差异SQL> SELECT DBMS_METADATA.GET...
convert_to_canonical♠ 用convert_to_canonical转换字串成规范的格式:     ♠ 使用 函数convert_to_canonicalSQL> SELECT dbms_metadata.convert_to...
SET_REMAP_PARAM♠ 可用直接 将对象创建到另一个SCHEMA中:   ♠ 使用 set_remap_param 实现CREATE OR REPLACE FUNCTION remap_schema RETURN CLOB ISh N...
CONVERT♠ 用这个程序可将元数据进行转换 :    ♠ 1.用 DBMS_METADATA.CONVERT编程create or replace function ddl_no_schema ( table_name varchar2 d...
CONVERT♠ 用这个程序可将元数据进行转换 :      ♠ 2.使用ddl_no_schema程序SQL> select ddl_no_schema(METADATA_TEST,HIHO,SYS) from dual;DDL_NO_SCH...
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
11g DBMS_METADATA包新变化♠   GET_CHECK_CONSTRAINT_NAME♠   GET_FK_CONSTRAINT_NAME♠   GET_HASHCODE♠   GET_INDEX_INTCOL♠   GET_ST...
get_check_constraint_name♠ 可用get_check_constraint_name列出约束名:    ♠ 1.创建表与约束:SQL> CREATE TABLE t (testcol NUMBER(3));表已创建。SQ...
get_check_constraint_name♠ 可用get_check_constraint_name列出约束名:  ♠ 2. 用get_check_constraint_name列出约束:set serveroutput onDECLA...
GET_FK_CONSTRAINT_NAME♠ 可用GET_FK_CONSTRAINT_NAME列出外键:  ♠ 1.创建主键、外部键表结构:CREATE TABLE parent (testcol NUMBER(3));ALTER TABLE...
GET_FK_CONSTRAINT_NAME♠ 可用GET_FK_CONSTRAINT_NAME列出外键:  ♠ 2.运行下面脚本列出外部键元数据:set serveroutput onDECLARE  otype VARCHAR2(30) :...
get_version♠ 可用GET_VERSION列出版本:   ♠ DBA可列出版本:SQL> SELECT dbms_metadata.get_version FROM dual;11.01.00.00.00               ...
dbms_metadata.compare_alter♠ dbms_metadata.compare_alter :  ♠ 可列出两个用户的两个对象的差异:  ♠ 参考DBMS_METADATA_DIFF.COMPARE_ALTER( dbms...
dbms_metadata.compare_alter♠ dbms_metadata.compare_alter :   ♠ 可列出两个用户的两个对象的差异:conn uwclass/uwclassset serveroutput on--DE...
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包:         ♠ DBMS_METADATA_DIFF包含的程序:SQL> desc DBMS_METADATA_DIFFPROCEDURE ADD_DOCU...
DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包:  ♠ 世界天天变,Oracle产品天天变;让我们天天学!  ♠ 这个包用于对变化进行管理(因为表数据总是变)  ♠   进行数据库对象的比较;同时可以生成修改差...
DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包:  ♠ DBMS_METADATA_DIFF.COMPARE_ALTER:  DBMS_METADATA_DIFF.COMPARE_ALTER(  object_...
DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包:   ♠ 世界天天变,Oracle产品天天变;让我们天天学!   ♠ 这个包用于对变化进行管理(因为表数据总是变): -- BEGIN SELECT dbms_m...
DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包:  ♠ COMPARE_ALTER_XML用于 :  --生成去差异化的脚本(XML格式)  DBMS_METADATA_DIFF.COMPARE_ALTER_X...
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
DBMS_METADATA包♠ 用DBMS_METADATA包需要注意安全:   ♠ 下面是Pete Finnigan给出的样例(1):SQL> connect scott/tigerConnected.SQL> select * from u...
DBMS_METADATA包♠ 用DBMS_METADATA包需要注意安全:   ♠ 下面是Pete Finnigan给出的样例(2):SQL> select sys.dbms_metadata.get_ddl(||scott.hack()||...
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
DBMS_METADATA包-API♠ 为什么使用 API:  ♠ 可能在开发应用代码时需要从数据字典抽取元数据  ♠ 需要操纵元数据(增加列,修改列等)  ♠ 转换元成为DDL以便在相同数据库或其他数据库重    建这些对象  ♠ 保持代码的...
DBMS_METADATA API♠ 样例1:以函数用DBMS_METADATA:  ♠ 1.创建 函数-可返回 EMP 表的元数据:SQL> connect scott/zhaoabc@orcl已连接。SQL> CREATE OR REPLA...
DBMS_METADATA API ♠ 样例1:以函数用DBMS_METADATA:       ♠ 2.运行 函数-可返回 EMP 表的元数据:SQL> SET PAGESIZE 0SQL> SET LONG 1000000SQL> SELE...
DBMS_METADATA API    ♠ 样例2:以过程用DBMS_METADATA:           ♠ 1.创建存储过程:SQL> CREATE TABLE my_metadata (md clob);               ...
DBMS_METADATA API ♠ 样例2:以过程用DBMS_METADATA:     ♠ 2.运行存储过程:SQL> EXECUTE get_Scott_md;PL/SQL 过程已成功完成。SQL> SET LONG 9000000SQ...
DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 1.创建具有差异的样例表:  SQL> CREATE TABLE TAB1  2 ( "EMPNO" NUMBER(4,0),  3 "...
DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 2.创建函数获取表的SXML信息: SQL> CREATE OR REPLACE FUNCTION get_table_sxml(nam...
DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 3.运行函数获取表的SXML信息: SQL> SELECT get_table_sxml(TAB1) FROM dual; <TABLE...
DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 3.运行函数获取表的SXML信息:  SQL> SELECT get_table_sxml(TAB2) FROM dual;   </C...
小结♠ DBMS_METADATA主要用途 :  ♠ 在SQL>下使用  ♠ 开发人员与应用迁移人员及DBA都应该掌握  ♠ 需要配置SQL>下的环境变量♠ DBMS_METADATA-API :  ♠ DBMS_METADATA可在PL/SQ...
小结♠ 返回的结果脚本可用于程序设计: ♠ 模式修订的源代码 ♠ 修改模式的拷贝 ♠ 删除、修改、重建对象的应用♠ DBMS_METADATA不足 : ♠ DBMS_METADATA可返回令人费解的DDL ♠ 存在某些安全问题         ...
内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADA...
使用常见错误样例♠ DBMS_METADATA.get_ddl没有设置SQL环境变量  ♠ 需要注意下面设置 : LINESIZE 显示行宽(字符数量) PAGESIZE 0 每页显示行书 FEEDBACK OFF 反馈行数量的不要 LONG ...
使用常见错误样例♠ DBMS_METADATA.get_ddl   ♠ 注意语法-大小写 : Correct dbms_metadata.get_ddl(VIEW,C_VIEW,OE) Error dbms_metadata.get_ddl(v...
使用常见错误样例♠ DBMS_METADATA.get_ddl   ♠ 注意语法-参数位置 : Correct dbms_metadata.get_ddl(VIEW,C_VIEW,OE) Error dbms_metadata.get_ddl(...
使用常见错误样例♠ DBMS_METADATA.get_ddl   ♠ 安全问题-授权使用? : Connect sys as sysdba SQL> select * from dba_tab_privs   2* where table_n...
使用常见错误样例♠ DBMS_METADATA.get_ddl   ♠ 安全问题-没有权限的用户?   ♠ 授予SELECT_CATALOG_ROLE权限的用户 : GRANT select, insert, update, delete, a...
使用常见错误样例♠ DBMS_METADATA.get_ddl   ♠ 在SQL*Plus 下使用的设置 : LINESIZE Wide enough to make the output readable. I usually set it ...
使用常见错误样例♠ DBMS_METADATA.get_ddl   ♠ 设置 : SET LINESIZE 132 PAGESIZE 0 FEEDBACK off VERIFY off TRIMSPOOL on LONG 1000000 COL...
参考资源♠ Oracle 原厂:   ♠ Oracle® Database PL/SQL Packages and Types Reference   11g Release 2 (11.2) E10577-04   ♠ Oracle® Dat...
Upcoming SlideShare
Loading in …5
×

1. Oracle 9i/10g/11g dbms metadata(95 页)

1,390 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,390
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
22
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

1. Oracle 9i/10g/11g dbms metadata(95 页)

  1. 1. Oracle 9i/10g/11gDBMS_METADATA包详细 赵元杰 北京群环域科技有限公司 2012.2
  2. 2. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 2/92
  3. 3. 关于导出元数据♠ Oracle 对源码OPEN的谨慎: ♠ 直到 Oracle 9i 为止,Oracle 对开放源代码都很谨慎,过去希望完整列出 自己创建的对象的元数据是困难的 ♠ 到Oracle 9i 时, Oracle 给出DBMS_METADATA元数据库包,打破不能完整 导出元数据库的束缚 ♠ 到Oracle 11g 为止,这个包不断完善当中。♠ DBMS_METADATA包的用途: ♠ 可完整地导出几乎所有对象的元数据 ♠ 此外,还具有管理的功能 ♠ 开发人员和DBA都需要这个包 ♠ 迁移工程师需要这个包 ♠ 提供命令方式与API接口 ♠ {ORACLE_HOME}/rdbms/admin/dbmsmeta.sql脚本创建。 3/92
  4. 4. 导出元数据的革命性变化 ♠ 新旧方法比较: ♠ 在8i及之前版本,从多个数据字典查询并拼接才能形成完整的DDL语 句:SELECT rem /* 创建表、主键、存储参数及pct参数 */ FROM DUAL;CLEAR COLUMN; SELECT table_name, 8000 seq, PRIMARY KEY ||COLUMN table_name NOPRINT; DECODE ( SUBSTR (constraint_name,1,3), SYS, NULL, LOWER ( constraint_name) )COLUMN seq NOPRINT; || ( BREAK ON table_name SKIP 1; FROM user_constraints WHERE constraint_type IN (P)SELECT table_name, 0 seq, CREATE TABLE UNION|| lower ( table_name ) || ( SELECT a.table_name, (8000 + POSITION) seq, || FROM user_tables lower (column_name) || DECODE (position, total_cons, );, ,) UNION FROM user_cons_columns a, user_constraints b,SELECT a.table_name, column_id seq, ( SELECT a.constraint_name, count(a.constraint_name) total_cons|| RPAD( LOWER( column_name ),35, ) || || FROM user_cons_columns a, user_constraints b RPAD ( DECODE ( data_type, NUMBER, data_type || WHERE a.constraint_name = b.constraint_namedecode(data_precision,null,null, ( ) AND b.constraint_type IN (P)||data_precision || decode(data_scale,null,null, , ) || GROUP by a.constraint_name ) cdecode(data_scale,null,null, data_scale) WHERE a.constraint_name = b.constraint_name|| decode(data_precision,null,null, ) ) , AND a.constraint_name = c.constraint_name DATE , data_type || , AND constraint_type IN (P) BLOB , data_type || , UNION LONG , data_type || , SELECT table_name, 9998 seq, PCTFREE || data_type PCT_FREE || PCTUSED || PCT_USED|| ( || data_length || ) FROM user_tables ), 20, ) || UNION DECODE ( NULLABLE, N, NOT NULL , NULL ) || SELECT table_name, 9999 seq, STORAGE ( INITIAL || DECODE ( column_id, total_columns, ), , ) INITIAL_EXTENT || NEXT || NEXT_EXTENT || ); FROM user_tab_columns a, user_tables b, FROM user_tables ( SELECT table_name, COUNT(1) total_columns ORDER BY table_name, seq; FROM user_tab_columns GROUP BY table_name ) c WHERE a.table_name = b.table_name AND a.table_name = c.table_name AND data_type <> UNDEFINED UNION 4/92
  5. 5. 导出元数据的革命性变化♠ 新旧方法比较: ♠ 在9i及之后版本得到DDL更简单:SELECT dbms_metadata.get_ddl(‘TABLE’,’EMPLOYEE’)FROM dual;DBMS_METADATA.GET_DDL(TABLE,EMPLOYEE)-----------------------------------------------------------------CREATE TABLE "SCM"."EMPLOYEE"( "LNAME" VARCHAR2(30 CHAR),"FNAME" VARCHAR2(30 CHAR),"SSN" NUMBER(9,0)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGINGSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "USER_DATA" 5/92
  6. 6. 元数据包的权限♠ DBMS_METEDATA: ♠ DBMS_METADATA 已经授予 PUBLIC:--包属于SYS用户:select * from dba_tab_privswhere table_name = ‘DBMS_METADATA’;GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE------- ----- ------------- ------- --------- --- ---PUBLIC SYS DBMS_METADATA SYS EXECUTE NO NO 6/92
  7. 7. Oracle 9i/10g/11g-子程序 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的子程序不同: 子程序 功能 9i 10g 11gOPEN 打开对象类型 y y ySET_FILTER 指定返回的限制 y y ySET_COUNT 指定返回对象的最大数量 y y yGET_QUERY FETCH_xxx 返回的文本 y y ySET_PARSE_ITEM 启用对象属性分析 y y ySET_TRANSFORM_PARAM XSLT风格 y y yFETCH_xxx 返回SET_FILTER, SET_COUNT, ADD_TRANSFORM建 y y y 数据 7/92
  8. 8. Oracle 9i/10g/11g-子程序 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的子程序不同: 子程序 功能 9i 10g 11gCLOSE 对OPEN打开的进行关闭 y y yGET_XML & GET_DDL 返回XML 或 DDL元数据 y y yGET_DEPENDENT_XML 返回一个或多个相关对象的XML 元数据 y y yGET_DEPENDENT_DDL 返回一个或多个相关对象的DDL 元数据 y y yGET_GRANTED_XML 以XML返回授权对象的元数据 y y yGET_GRANTED_DDL 以DDL返回授权对象的元数据 y y y 8/92
  9. 9. Oracle 9i/10g/11g-子程序♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的子程序不同: 子程序 功能 9i 10g 11gADD_TRANSFORM 指定转换XML y ySET_REMAP_PARAM 将对象创建到另一个SCHEMA中 y yCONVERT 将元数据转换为另外的格式 ** y yOPENW Opens a write context y yPUT 发生XML到数据库 y yget_version 得到版本信息 YIS_OBJECT_XDB_GENERATED 检查对象是否用 Y dbms_xmlschema.registerschem a做过处理OPENC 建立对象上下文比较并以XML输出 9/92 Y
  10. 10. Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gASSOCIATION 相关统计 y y yAUDIT 获得审计信息 y y yAUDIT_OBJ 审计模式对象 y y yCLUSTER 簇对象 y y yCOMMENT 获取表的注释 y y yCONSTRAINT 不包括IOT的主键;NOT NULL等 y y yCONTEXT 应用上下文 y y yDB_LINK 获取数据库链接信息 y y y 10/92
  11. 11. Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gDEFAULT_ROLE 默认的角色 y y yDIMENSION 数据库中的维 y y yDIRECTORY 目录信息 y y yFUNCTION 函数 y y yINDEX 索引 y y yINDEXTYPE 索引类型 y y yJAVA_SOURCE Java 源码 Y y yLIBRARY 库信息(由 C和PL/SQL创建的库) y y y 11/92
  12. 12. Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gMATERIALIZED_VIEW 实体视图 y y yMATERIALIZED_VIEW_LOG 实体视图日志 y y yOBJECT_GRANT 对象权限 y y yOPERATOR 算法 y y yOUTLINE 概要 y y yPACKAGE 包 y y yPACKAGE_SPEC 包的说明 y y yPACKAGE_BODY 包的详细 y y y 12/92
  13. 13. Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gPROCEDURE 存储过程 y y yPROFILE 资源限额 y y yPROXY 代理 y y yREF_CONSTRAINT 引用 y y yROLE 角色 y y yROLE_GRANT 角色权限 y y yROLLBACK_SEGMENT 回滚段 y y ySEQUENCE 序列 y y y 13/92
  14. 14. Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gSYNONYM 同义词 y y ySYSTEM_GRANT 系统权限 Y y yTABLE 表 Y y YTABLESPACE 表空间 Y Y YTABLESPACE_QUOTA 表空间使用限额 y Y yTRIGGER 触发器 y Y YTRUSTED_DB_LINK 数据库链接 Y Y YTYPE 类型 y y y 14/92
  15. 15. Oracle 9i/10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gTYPE_SPEC 类型描述 y y yTYPE_BODY 类型主体 y y yUSER 用户 y y yVIEW 视图 y y yXMLSCHEMA XML模式 y y yAQ_QUEUE 高级队列 Y YAQ_QUEUE_TABLE 高级队列表 Y YAQ_TRANSFORM 高级对象了转换 Y Y 15/92
  16. 16. Oracle 10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gDATABASE_EXPORT 导出数据库全部元数据 Y YFGA_POLICY 精细的审计策略 Y YINDEX_STATISTICS 索引统计 Y YJOB 作业 Y YRESOURCE_COST 资源代价 Y YRLS_CONTEXT 精细访问控制上下文 Y YRLS_GROUP 精细访问控制组 Y YRLS_POLICY 精细访问控制 策略 Y Y 16/92
  17. 17. Oracle 10g/11g-支持类型 ♠ DBMS_METADATA 包-9i/10g/11g 差异: ♠ 不同版本支持的类型不同: 类型 功能 9i 10g 11gRMGR_CONSUMER_GROUP 资源计划 组 Y YRMGR_INTITIAL_CONSUMER_GROUP 资源计划消费组 Y YRMGR_PLAN 资源计划 Y YRMGR_PLAN_DIRECTIVE 资源计划指令 Y YSCHEMA_EXPORT 模式导出 Y YTABLE_DATA 表数据 Y YTABLE_EXPORT 表卸出 Y YTABLE_STATISTICS 表统计数据 Y YTRANSPORTABLE_EXPORT 传输导出 Y Y 17/92
  18. 18. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 18/92
  19. 19. DBMS_METADATA使用环境♠ 在SQL*Plus 环境下使用: ♠ 在PL/SQL中使用包的方法 ♠ 在SQL>下命令使用select * from dba_tab_privswhere table_name = ‘DBMS_METADATA’;GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE------- ----- ------------- ------- --------- --- ---PUBLIC SYS DBMS_METADATA SYS EXECUTE NO NO 19/92
  20. 20. DBMS_METADATA使用环境♠ 在SQL*Plus 环境下使用注意: ♠ 在SQL>下命令使用-大小写敏感问题--类型用大写,比如:dbms_metadata.get_ddl(VIEW,C_VIEW,OE)--错误:参数不能用小写dbms_metadata.get_ddl(view,C_VIEW,OE)ERROR:ORA-31600: invalid input value view for parameter OBJECT_TYPE in functionGET_DDLORA-06512: at "SYS.DBMS_METADATA", line 2681ORA-06512: at "SYS.DBMS_METADATA", line 2732ORA-06512: at "SYS.DBMS_METADATA", line 4333ORA-06512: at line 1--正确,参数直接写dbms_metadata.get_ddl(VIEW,C_VIEW,OE)--错误,参数不能传递dbms_metadata.get_ddl(object_type=>VIEW,name=>C_VIEW,schema=>OE)*ERROR at line 2:ORA-00907: missing right parenthesis 20/92
  21. 21. DBMS_METADATA使用环境♠ 使用DBMS_METADATA包的权限问题: ♠ 如果没有授予角色,则提示错误: ♠ 授予SELECT_CATALOG_ROLE角色--权限不够时的提示GRANT select, insert, update, delete, alter ON locations TO oe;connect oe/demo;SELECT DBMS_METADATA.GET_DDL(TABLE, LOCATIONS, HR) ddl_callFROM dual;ERROR:ORA-31603: object "LOCATIONS" of type TABLE not found in schema "HR"ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105ORA-06512: at "SYS.DBMS_METADATA", line 2805ORA-06512: at "SYS.DBMS_METADATA", line 4333ORA-06512: at line 1 21/92
  22. 22. DBMS_METADATA使用环境♠ 使用DBMS_METADATA包的技巧: ♠ 在SQL>下使用,要设置环境参数,如:--常用格式设置:LINESIZE 行宽PAGESIZE 每页行数FEEDBACK OFF 反馈行数的数量LONG 至少设置 100000 -CLOBTRIMSPOOL ON 对空格符的截断 22/92
  23. 23. DBMS_METADATA.GET_DDL♠ GET_DDL 可导出许多类型对象的元数据: ♠ 例子1:最简单的用法连接到:Oracle Database 11g Enterprise Edition Release11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and RealApplication Testing optionsSQL> set line 188SQL> set trimspool onSQL> set long 10000SQL> set pagesize 0SQL> select dbms_metadata.get_ddl(TABLE,EMP)from dual; 23/92
  24. 24. DBMS_METADATA.GET_DDL♠ GET_DDL 可导出许多类型对象的元数据: ♠ 例子2:从DBA角度导出某个用户的某个表:SQL> show userUSER 为 "SYSTEM"SQL> select dbms_metadata.get_ddl(TABLE,EMP,SCOTT) from dual; CREATE TABLE "SCOTT"."EMP" ( "EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), “MGR” NUMBER(4,0),... ... 24/92
  25. 25. DBMS_METADATA.GET_DDL♠ GET_DDL 可导出许多类型对象的元数据: ♠ 例子3:从DBA角度导出某个用户的某个表:set pagesize 0set linesize 200set long 1000000set longchunksize 1000000spool c:scott_emp.sql-- 可从数据字典查询出表名也可以:select dbms_metadata.get_ddl(TABLE,a.table_name,SCOTT)from dba_tables awhere table_name = DEPTand owner = SCOTTspool off 25/92
  26. 26. DBMS_METADATA.GET_DDL♠ GET_DDL 可导出Procedure: ♠ 例子4:导出某个procedure:CREATE OR REPLACE PROCEDURE abc ASBEGINNULL;END abc;--SET LONG 1000000SELECT dbms_metadata.get_ddl(object_type, object_name)FROM user_objects WHERE object_name = ABC;DBMS_METADATA.GET_DDL(PROCEDURE,OBJECT_NAME)--------------------------------------------------------------CREATE OR REPLACE PROCEDURE "PLSQL_USER"."ABC" ASBEGINNULL;END abc; 26/92
  27. 27. DBMS_METADATA.set_transform_param♠ 默认导出结果与转换设置: ♠ 1. PRETTY缩排或换行格式化 ♠ 2. STORAGE {TRUE | FALSE } ♠ 3. SEGMENT_ATTRIBUTES {TRUE | FALSE } ♠ 4. CONSTRAINTS {TRUE | FALSE } ♠ 5. REF_CONSTRAINTS {TRUE | FALSE } ♠ 6. CONSTRAINTS_AS_ALTER {TRUE | FALSE } ♠ 7. SQLTERMINATOR {TRUE | FALSE } ♠ 8. FORCE {TRUE | FALSE } ♠ 9. DEFAULT {TRUE } 27/92
  28. 28. DBMS_METADATA.set_transform_param♠ set_transform_param可对导出结果的格式处理: ♠ --1.输出信息采用缩排或换行格式化 ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, PRETTY, TRUE); ♠ --2.确保每个语句都带分号 ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, SQLTERMINATOR, TRUE); 28/92
  29. 29. DBMS_METADATA.set_transform_param♠ set_transform_param可对导出结果进行格式处理: ♠ --3.关闭表索引、外键等约束信息 ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘CONSTRAINTS’, FALSE); ♠ --4.关闭表外键约束信息 ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, ‘REF_CONSTRAINTS’, FALSE); ♠ --5.关闭用Alter 建立的约束信息 ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, CONSTRAINTS_AS_ALTER, FALSE); 29/92
  30. 30. DBMS_METADATA.set_transform_param♠ set_transform_param可对导出结果进行格式处理: ♠ --6.关闭存储属性描述: ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transfo rm, ‘STORAGE’, FALSE); ♠ EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFO RM,DEFAULT ); ♠ --7.关闭表空间属性描述: ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transfo rm, TABLESPACE, FALSE); ♠ --8.关闭创建表的PCTFREE、NOCOMPRESS等属性 ♠ EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transfo rm, SEGMENT_ATTRIBUTES, FALSE); 30/92
  31. 31. 未使用SET_TRANSFORM_PARAM♠ 用SET_TRANSFORM_PARAM 中: ♠ 使用set_transform_param过程来实现输出子句的控制 SQL> select dbms_metadata.get_ddl(TABLE, EMP) from dual; DBMS_METADATA.GET_DDL(TABLE,EMP) -------------------------------------------------------------------------------- CREATE TABLE "SCOTT"."EMP" ("EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS" ENABLE, CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE ) SEGMENT CREATION IMMEDIATE 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 FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 31/92
  32. 32. 使用SET_TRANSFORM_PARAM ♠ 用SET_TRANSFORM_PARAM 中: ♠ 使用set_transform_param过程来实现输出子句的控制SQL> EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,STORAGE,FALSE);PL/SQL 过程已成功完成。SQL> select dbms_metadata.get_ddl(TABLE, EMP) from dual; 关闭存储属 性描述DBMS_METADATA.GET_DDL(TABLE,EMP)-------------------------------------------------------------------------------- CREATE TABLE "SCOTT"."EMP" ("EMPNO" NUMBER(4,0),"ENAME" VARCHAR2(10),"JOB" VARCHAR2(9),"MGR" NUMBER(4,0),"HIREDATE" DATE,"SAL" NUMBER(7,2),"COMM" NUMBER(7,2),"DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS TABLESPACE "USERS" ENABLE, CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING TABLESPACE "USERS" 32/92
  33. 33. 未使用SET_TRANSFORM_PARAM ♠ GET_DDL 可导出表的转换: ♠ 例子5:没有声明转换要求,则直接完全导出:SET LONG 1000000select dbms_metadata.get_ddl(TABLE,EMP,SCOTT) from dual;CREATE TABLE "SCOTT"."EMP"( "EMPNO" NUMBER(4,0),"ENAME" VARCHAR2(10),"JOB" VARCHAR2(9),"MGR" NUMBER(4,0),"HIREDATE" DATE,"SAL" NUMBER(7,2),"COMM" NUMBER(7,2),"DEPTNO" NUMBER(2,0),CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) 段对象的TABLESPACE "USERS" ENABLE,CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") 属性信息REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGINGSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "USERS" 33/92
  34. 34. 使用SET_TRANSFORM_PARAM♠ GET_DDL 可导出表的转换: ♠ 例子6:先用set_transform_param声明转换:execute dbms_metadata.set_transform_param(dbms_metadata.session_transform,‘SEGMENT_ATTRIBUTES’, false );--select dbms_metadata.get_ddl(TABLE,EMP,SCOTT) from dual; 段对象的属性CREATE TABLE "SCOTT"."EMP" 信息不显示( "EMPNO" NUMBER(4,0),"ENAME" VARCHAR2(10),"JOB" VARCHAR2(9),"MGR" NUMBER(4,0),"HIREDATE" DATE,"SAL" NUMBER(7,2),"COMM" NUMBER(7,2),"DEPTNO" NUMBER(2,0),CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO") ENABLE,CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE 没有段对象) 的属性信息 34/92
  35. 35. 使用SET_TRANSFORM_PARAM♠ GET_DDL 可导出表的转换: ♠ 例子7:先用set_transform_param声明转换:execute dbms_metadata.set_transform_param(dbms_metadata.session_transform,‘CONSTRAINTS’, FALSE);execute dbms_metadata.set_transform_param(dbms_metadata.session_transform,‘REF_CONSTRAINTS’, FALSE);execute dbms_metadata.set_transform_param(dbms_metadata.session_transform,‘SQLTERMINATOR’, TRUE);select dbms_metadata.get_ddl(TABLE,EMP,SCOTT) from dualCREATE TABLE "SCOTT"."EMP"( "EMPNO" NUMBER(4,0),"ENAME" VARCHAR2(10), 每个语句以"JOB" VARCHAR2(9), 分号结束"MGR" NUMBER(4,0),"HIREDATE" DATE,"SAL" NUMBER(7,2),"COMM" NUMBER(7,2),"DEPTNO" NUMBER(2,0)); 35/92
  36. 36. 使用SET_TRANSFORM_PARAM ♠ GET_DDL 输出信息采用缩排或换行格式化: ♠ 例子8:EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_ transform, PRETTY, TRUE);SQL> exec dbms_metadata.set_transform_param( DBMS_METADATA.SESSION_TRANSFORM, PRETTY, TRUE);SQL> select dbms_metadata.get_ddl(TABLE,EMP,SCOTT) from dual;CREATE TABLE "SCOTT"."EMP"( "EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICSSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "USERS" ENABLE, CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 36/92
  37. 37. GET_DDL导出Profile ♠ GET_DDL 可导出PROFILE信息: ♠ 例子9:用PROFILE类型:SQL> select dbms_metadata.get_ddl(PROFILE,DEFAULT ) from dual ;DBMS_METADATA.GET_DDL(PROFILE,DEFAULT)----------------------------------------------------------------- ALTER PROFILE "DEFAULT" LIMIT COMPOSITE_LIMIT UNLIMITED SESSIONS_PER_USER UNLIMITED CPU_PER_SESSION UNLIMITED CPU_PER_CALL UNLIMITED LOGICAL_READS_PER_SESSION UNLIMITED LOGICAL_READS_PER_CALL UNLIMITED IDLE_TIME UNLIMITED CONNECT_TIME UNLIMITED PRIVATE_SGA UNLIMITED FAILED_LOGIN_ATTEMPTS 10 PASSWORD_LIFE_TIME 15552000/86400 PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX UNLIMITED PASSWORD_VERIFY_FUNCTION NULL PASSWORD_LOCK_TIME 86400/86400 PASSWORD_GRACE_TIME 604800/86400 37/92
  38. 38. GET_DDL导出注释♠ GET_DDL 导出表的注释信息: ♠ 例子10:用COMMENT类型:--获取表注释SELECT DBMS_LOB.substr(DBMS_METADATA.get_dependent_ddl(COMMENT, table_name))FROM (SELECT distinct table_nameFROM user_col_commentsWHERE comments IS NOT NULL) 38/92
  39. 39. GET_DDL导出db_link ♠ GET_DDL 导出DB_LINK信息: ♠ 例子11:9i用DB_LINK类型(口令时明码):--Oracle 9i@>show userUSER is "TEST"@>create database link l_test connect to test identified by test using test;Database link created.@>select dbms_metadata.get_ddl(DB_LINK,L_TEST,user) from dual;DBMS_METADATA.GET_DDL(DB_LINK,L_TEST,USER)——————————————————————————– CREATE DATABASE LINK "L_TEST" CONNECT TO "TEST" IDENTIFIED BY "TEST" USING test@>conn /as sysdbaConnected.@>select NAME,USERID,PASSWORD from link$;NAME USERID PASSWORD—————————— —————————— ——————————L_TEST TEST TEST 39/92
  40. 40. GET_DDL导出db_link♠ GET_DDL 导出DB_LINK信息: ♠ 例子12:10g/11g用DB_LINK类型(口令为Hash值):--10g/11gtest@TEST>show userUSER is "TEST"test@TEST>create database link l_chen connect to test identified by test using chen;Database link created.test@TEST>select DB_LINK,USERNAME from user_db_links;DB_LINK USERNAME————————————————– ——————————L_CHEN.REGRESS.RDBMS.DEV.US.ORACLE.COM TESTtest@TEST>selectdbms_metadata.get_ddl(DB_LINK,L_CHEN.REGRESS.RDBMS.DEV.US.ORACLE.COM,user) from dual;DBMS_METADATA.GET_DDL(DB_LINK,L_CHEN.REGRESS.RDBMS.DEV.US.ORACLE.COM,USER)——————————————————————————– CREATE DATABASE LINK "L_CHEN.REGRESS.RDBMS.DEV.US.ORACLE.COM" CONNECT TO "TEST" IDENTIFIED BY VALUES 05C9398288555E95E498B33A68083EDD2E USING chentest@TEST>conn /as sysdbaConnected. 10g/11g 口令sys@TEST>select NAME,USERID,PASSWORD,PASSWORDX from link$;NAME USERID PASSWORD PASSWORDX 做了加密—————————————- ———- ———- —————————————- 40/92
  41. 41. GET_DDL导出同义词♠ 例子13:导出用户同义词脚本: ♠ 自动导出创建同义词批命令: --批量产生再创建同义词的脚本: set pagesize 0 set linesize 200 SET TRIMSPOOL ON set long 1000000 set longchunksize 1000000 spool c:scott_emp.sql -- 可从数据字典查询出表名也可以: select dbms_metadata.get_ddl(SYNONYM,OBJECT_NAME,OWNE R) from DBA_SYNONYMS a where owner = SCOTT / spool off 41/92
  42. 42. GET_DDL导出AQ♠ DBMS_METADATA.get_ddl ♠ 对象类型-AQ_QUEUE :Select dbms_metadata.get_ddl(AQ_QUEUE,DEF$_AQERROR,SYSTEM)from dual;DBMS_METADATA.GET_DDL(AQ_QUEUE,DEF$_AQERROR,SYSTEM)-------------------------------------------------------------------- BEGIN DBMS_AQADM.CREATE_QUEUE( Queue_name => SYSTEM.DEF$_AQERROR, Queue_table => SYSTEM.DEF$_AQERROR, Queue_type => 0, Max_retries => 5, Retry_delay => 0, dependency_tracking => TRUE, comment => Error Queue for Deferred RPCs) END 42/92
  43. 43. GET_DDL导出AQ♠ DBMS_METADATA.get_ddl ♠ 对象类型-AQ_QUEUE_TABLE :SQL> selectdbms_metadata.get_ddl(AQ_QUEUE_TABLE,DEF$_AQERROR,SYSTEM)from dual;DBMS_METADATA.GET_DDL(AQ_QUEUE_TABLE,DEF$_AQERROR,SYSTEM)-------------------------------------------------------------------------------- BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE( Queue_table => SYSTEM.DEF$_AQERROR, Queue_payload_type => VARIANT, Sort_list => ENQ_TIME, Compatible => 8.0.3) END 43/92
  44. 44. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 44/92
  45. 45. GET_DEPENDENT_DDL♠ 可导出对象依赖关系: ♠ 使用 GET_DEPENDENT_DDL得到相关的DDL ♠ 类型不能是TABLESQL> set long 9999SQL> SELECT DBMS_METADATA.get_dependent_ddl (INDEX,EMP,SCOTT) from dualSQL> /DBMS_METADATA.GET_DEPENDENT_DDL(INDEX,EMP,SCOTT)-------------------------------------------------------------------------------- CREATE UNIQUE INDEX "SCOTT"."PK_EMP" ON "SCOTT"."EMP" ("EMPNO") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULTFLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS" 45/92
  46. 46. GET_DEPENDENT_DDL ♠ 可导出对象依赖关系: ♠ 使用 GET_DEPENDENT_DDL得到相关的DDL ♠ 类型不能是TABLESQL> SELECT DBMS_METADATA.get_dependent_ddl (INDEX,DEPT,SCOTT) from dualSQL> /DBMS_METADATA.GET_DEPENDENT_DDL(INDEX,DEPT,SCOTT)-------------------------------------------------------------------------------- CREATE UNIQUE INDEX "SCOTT"."PK_DEPT" ON "SCOTT"."DEPT" ("DEPTNO") PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULTFLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS" 46/92
  47. 47. GET_DEPENDENT_DDL♠ 可导出对象依赖关系: ♠ 使用 GET_DEPENDENT_DDL ♠ 得到相关的DDLSQL> GRANT select ON emp TO system;授权成功。SQL> GRANT select ON emp TO ctxsys;授权成功。SQL> set long 9999SQL> --SQL> SELECT dbms_metadata.get_dependent_ddl(OBJECT_GRANT,EMP) 2 FROM dual;DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_GRANT,EMP)-------------------------------------------------------------------------------- GRANT SELECT ON "SCOTT"."EMP" TO "SYSTEM" GRANT SELECT ON "SCOTT"."EMP" TO "CTXSYS" 47/92
  48. 48. GET_GRANTED_DDL♠ 可用GET_GRANTED_DDL导出权限: ♠ 使用 GET_GRANTED_DDL 列出系统权限CREATE USER PLSQL_USER IDENTIFIED BY PLSQL_USER;GRANT CONNECT, RESOURCE, DBA TO PLSQL_USER;GRANT SELECT ON SCOTT.EMP TO PLSQL_USER;--SELECT DBMS_METADATA.GET_GRANTED_DDL(SYSTEM_GRANT,PLSQL_USER)FROM DUAL;--GRANT UNLIMITED TABLESPACE TO "PLSQL_USER"SELECT DBMS_METADATA.GET_GRANTED_DDL(ROLE_GRANT,PLSQL_USER)FROM DUAL;--GRANT "CONNECT" TO "PLSQL_USER"GRANT "RESOURCE" TO "PLSQL_USER"GRANT "DBA" TO "PLSQL_USER" 48/92
  49. 49. GET_GRANTED_DDL♠ 可用GET_GRANTED_DDL导出权限: ♠ 使用 GET_GRANTED_DDL 列出对象权限SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT,PLSQL_USER)FROM DUAL;GRANT SELECT ON "SCOTT"."EMP" TO "PLSQL_USER"SELECT DBMS_METADATA.GET_GRANTED_DDL(DEFAULT_ROLE,PLSQL_USER)FROM DUAL;ALTER USER "PLSQL_USER" DEFAULT ROLE ALL--SELECT DBMS_METADATA.GET_GRANTED_DDL(ROLE_GRANT, DBA)FROM DUAL;GRANT "SELECT_CATALOG_ROLE" TO "DBA" WITH ADMIN OPTION;GRANT "EXECUTE_CATALOG_ROLE" TO "DBA" WITH ADMIN OPTION;GRANT "DELETE_CATALOG_ROLE" TO "DBA" WITH ADMIN OPTION; 49/92
  50. 50. GET_GRANTED_DDL ♠ 可用GET_GRANTED_DDL导出权限: ♠ 使用 GET_GRANTED_DDL 列出DBA拥有的权限SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT, DBA)FROM DUAL;GRANT ALTER ON "SYS"."MAP_OBJECT" TO "DBA";GRANT SELECT ON "SYS"."MAP_OBJECT" TO "DBA";GRANT FLASHBACK ON "SYS"."MAP_OBJECT" TO "DBA";GRANT EXECUTE ON "SYS"."DBMS_FLASHBACK" TO "DBA";--SELECT DBMS_METADATA.GET_GRANTED_DDL(SYSTEM_GRANT, DBA)FROM DUAL;GRANT CREATE ANY SQL PROFILE TO "DBA" WITH ADMIN OPTION;GRANT ADMINISTER ANY SQL TUNING SET TO "DBA" WITH ADMIN OPTION;GRANT DROP ANY SQL PROFILE TO "DBA" WITH ADMIN OPTION;GRANT MANAGE SCHEDULER TO "DBA" WITH ADMIN OPTION; 50/92
  51. 51. GET_GRANTED_DDL♠ 可用GET_GRANTED_DDL导出权限: ♠ GET_GRANTED_DDL 列出Public拥有的权限SQL> SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT, PUBLIC) 2 FROM DUAL;DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT,PUBLIC)-------------------------------------------------------------------------------- GRANT USE ON "SYS"."ORA$BASE" TO PUBLIC GRANT SELECT ON "SYS"."DUAL" TO PSQL> conn scott/tiger123已连接。SQL> grant select on emp to public;授权成功。SQL> SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT, PUBLIC) 2 FROM DUAL;DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT,PUBLIC)-------------------------------------------------------------------------------- GRANT SELECT ON "SCOTT"."EMP" TO PUBLICSQL> connect sys as sysdba输入口令:已连接。SELECT DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT, PUBLIC) 在sys下看不到scott授 FROM DUAL;DBMS_METADATA.GET_GRANTED_DDL(OBJECT_GRANT,PUBLIC) 权给Public的数据-------------------------------------------------------------------------------- GRANT USE ON "SYS"."ORA$BASE" TO PUBLIC GRANT SELECT ON "SYS"."DUAL" TO P 51/92
  52. 52. GET_QUERY♠ 可用GET_QUERY 查询对象的信息: ♠ dbms_metadata.get_query 获得XML元数据;set long 1000000set serveroutput onset pagesize 0set linesize 1000set trim onset trimspool onspool c:demo.txtDECLARE n NUMBER; s VARCHAR2(32767);BEGIN SELECT dbms_metadata.open(TABLE) INTO n FROM dual; SELECT dbms_metadata.get_query (n) INTO s FROM dual; dbms_output.put_line(s); dbms_metadata.close(n);END;/spool off 52/92
  53. 53. GET_XML♠ 可用GET_XML 查询对象的信息: ♠ dbms_metadata.get_XML获得XML元数据; ♠ 与dbms_metadata.get_query有些差异SQL> SELECT DBMS_METADATA.GET_XML(TABLE, EMP) FROM DUAL;<?xml version="1.0"?><ROWSET><ROW> <TABLE_T><VERS_MAJOR>1</VERS_MAJOR><VERS_MINOR>3 </VERS_MINOR><OBJ_NUM>73196</OBJ_NUM>… 53/92
  54. 54. convert_to_canonical♠ 用convert_to_canonical转换字串成规范的格式: ♠ 使用 函数convert_to_canonicalSQL> SELECT dbms_metadata.convert_to_canonical(11.1.0.6.0) 2 FROM dual;11.01.00.06.00--将年月转换成规范的格式:SQL> SELECT dbms_metadata.convert_to_canonical(2009.10.6) 2* FROM dual;2009.10.06.00.00 54/92
  55. 55. SET_REMAP_PARAM♠ 可用直接 将对象创建到另一个SCHEMA中: ♠ 使用 set_remap_param 实现CREATE OR REPLACE FUNCTION remap_schema RETURN CLOB ISh NUMBER; --handle returned by OPENth NUMBER; -- handle returned by ADD_TRANSFORMdoc CLOB;BEGIN-- 指定对象类型h := DBMS_METADATA.OPEN(TABLE);-- 设置对象过滤DBMS_METADATA.SET_FILTER(h,SCHEMA,HR);DBMS_METADATA.SET_FILTER(h,NAME,TIMECARDS);-- 请求修改 schema 名称.th := DBMS_METADATA.ADD_TRANSFORM(h,MODIFY);DBMS_METADATA.SET_REMAP_PARAM(th,REMAP_SCHEMA,HR,SCOTT);DBMS_METADATA.SET_REMAP_PARAM(th,REMAP_TABLESPACE,USERS,SYSTEM);-- 请求数据转换为 DDL.th := DBMS_METADATA.ADD_TRANSFORM(h,DDL);-- 段的属性不返回DBMS_METADATA.SET_TRANSFORM_PARAM(th,STORAGE,false);-- 返回对象doc := DBMS_METADATA.FETCH_CLOB(h);-- 释放资源DBMS_METADATA.CLOSE(h);RETURN doc;END remap_schema;/ 55/92
  56. 56. CONVERT♠ 用这个程序可将元数据进行转换 : ♠ 1.用 DBMS_METADATA.CONVERT编程create or replace function ddl_no_schema ( table_name varchar2 default NULL, from_schema varchar2 default NULL, to_schemavarchar2 default NULL)return clob ish1 NUMBER; -- handle returned by OPENh2 NUMBER; -- handle returned by OPENWth1 NUMBER; -- handle returned by ADD_TRANSFORM for MODIFYth2 NUMBER; -- handle returned by ADD_TRANSFORM for DDLxml CLOB; -- XML documenthiho sys.KU$_MULTI_DDLS;hiho2 sys.KU$_DDLs;hiho3 cloB;begin h1 := DBMS_METADATA.OPEN(TABLE); DBMS_METADATA.SET_FILTER(h1,NAME,table_name); DBMS_METADATA.SET_FILTER(h1,SCHEMA,from_schema); xml := DBMS_METADATA.FETCH_CLOB(h1); DBMS_METADATA.CLOSE(h1); h2 := DBMS_METADATA.OPENW(TABLE); th1 := DBMS_METADATA.ADD_TRANSFORM(h2,MODIFY); DBMS_METADATA.SET_REMAP_PARAM(th1,REMAP_SCHEMA,from_schema,to_schema); th2 := DBMS_METADATA.ADD_TRANSFORM(h2,DDL); hiho := DBMS_METADATA.CONVERT(h2, xml); hiho2 := hiho(1).DDLS; hiho3 := hiho2(1).ddltext; DBMS_METADATA.CLOSE(h2); 56/92
  57. 57. CONVERT♠ 用这个程序可将元数据进行转换 : ♠ 2.使用ddl_no_schema程序SQL> select ddl_no_schema(METADATA_TEST,HIHO,SYS) from dual;DDL_NO_SCHEMA(METADATA_TEST,--------------------------------------------------------------------------------CREATE TABLE "SYS"."METADATA_TEST" ( "I" NUMBER(*,0) );SQL> select ddl_no_schema(METADATA_TEST,HIHO,NULL) from dual;DDL_NO_SCHEMA(METADATA_TEST,--------------------------------------------------------------------------------CREATE TABLE "METADATA_TEST" ( "I" NUMBER(*,0) ); 57/92
  58. 58. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 58/92
  59. 59. 11g DBMS_METADATA包新变化♠ GET_CHECK_CONSTRAINT_NAME♠ GET_FK_CONSTRAINT_NAME♠ GET_HASHCODE♠ GET_INDEX_INTCOL♠ GET_STAT_COLNAME♠ GET_STAT_INDNAME♠ GET_SXML_DDL♠ OPEN_GET_FK_CONSTRAINT_NAME♠ PARSE_CONDITION♠ PARSE_DEFAULT♠ PARSE_QUERY♠ SET_FK_CONSTRAINT_COL_PAIR♠ SET_PARAMETER 59/92
  60. 60. get_check_constraint_name♠ 可用get_check_constraint_name列出约束名: ♠ 1.创建表与约束:SQL> CREATE TABLE t (testcol NUMBER(3));表已创建。SQL> ALTER TABLE t 2 ADD CONSTRAINT cc_t_testcol_gt 3 CHECK (testcol > 0);表已更改。SQL> ALTER TABLE t 2 ADD CONSTRAINT cc_t_testcol_bt 3 CHECK (testcol BETWEEN 1 AND 10);表已更改。SQL> SELECT constraint_name, search_condition 2 FROM user_constraints 3 WHERE table_name = T;CC_T_TESTCOL_GT testcol > 0CC_T_TESTCOL_BT testcol BETWEEN 1 AND 10 60/92
  61. 61. get_check_constraint_name♠ 可用get_check_constraint_name列出约束名: ♠ 2. 用get_check_constraint_name列出约束:set serveroutput onDECLARE otype VARCHAR2(30) := TABLE; pc CLOB := testcol > 0; retval VARCHAR2(100);BEGIN retval := dbms_metadata.get_check_constraint_name(otype,USER, T, pc); dbms_output.put_line(retval);END;/ 61/92
  62. 62. GET_FK_CONSTRAINT_NAME♠ 可用GET_FK_CONSTRAINT_NAME列出外键: ♠ 1.创建主键、外部键表结构:CREATE TABLE parent (testcol NUMBER(3));ALTER TABLE parentADD CONSTRAINT pk_parentPRIMARY KEY (testcol);CREATE TABLE child (testcol NUMBER(3));ALTER TABLE childADD CONSTRAINT fk_child_parent_testcolFOREIGN KEY (testcol)REFERENCES parent(testcol); 62/92
  63. 63. GET_FK_CONSTRAINT_NAME♠ 可用GET_FK_CONSTRAINT_NAME列出外键: ♠ 2.运行下面脚本列出外部键元数据:set serveroutput onDECLARE otype VARCHAR2(30) := TABLE; hdl NUMBER; retval VARCHAR2(100);BEGIN hdl := dbms_metadata.open_get_fk_constraint_name(otype,USER, CHILD, USER, PARENT); dbms_output.put_line(hdl); dbms_metadata.set_fk_constraint_col_pair(hdl, TESTCOL,TESTCOL); retval := dbms_metadata.get_fk_constraint_name(hdl); dbms_output.put_line(retval); dbms_metadata.close(hdl);END;/ 63/92
  64. 64. get_version♠ 可用GET_VERSION列出版本: ♠ DBA可列出版本:SQL> SELECT dbms_metadata.get_version FROM dual;11.01.00.00.00 64/92
  65. 65. dbms_metadata.compare_alter♠ dbms_metadata.compare_alter : ♠ 可列出两个用户的两个对象的差异: ♠ 参考DBMS_METADATA_DIFF.COMPARE_ALTER( dbms_metadata.compare_alter ( object_type IN VARCHAR2, name1 IN VARCHAR2, name2 IN VARCHAR2, schema1 IN VARCHAR2 DEFAULT NULL, schema2 IN VARCHAR2 DEFAULT NULL, network_link1 IN VARCHAR2 DEFAULT NULL, network_link2 IN VARCHAR2 DEFAULT NULL) RETURN CLOB; 65/92
  66. 66. dbms_metadata.compare_alter♠ dbms_metadata.compare_alter : ♠ 可列出两个用户的两个对象的差异:conn uwclass/uwclassset serveroutput on--DECLARE c CLOB;BEGIN SELECT dbms_metadata.compare_alter(TABLE, SERVERS, SERV_INST, USER, USER) INTO c FROM dual; dbms_output.put_line(c); dbms_advisor.create_file(c, CTEMP, compalter.txt);END;/ 66/92
  67. 67. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 67/92
  68. 68. DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包: ♠ DBMS_METADATA_DIFF包含的程序:SQL> desc DBMS_METADATA_DIFFPROCEDURE ADD_DOCUMENT参数名称 类型 输入/输出默认值? FUNCTION COMPARE_SXML RETURNS CLOB------------------------------ ----------------------- ------ -------- 参数名称 类型 输入/输出默认值? HANDLE NUMBER IN ------------------------------ ----------------------- ------ -------- DOCUMENT XMLTYPE IN OBJECT_TYPE VARCHAR2 INPROCEDURE ADD_DOCUMENT NAME1 VARCHAR2 IN参数名称 类型 输入/输出默认值? NAME2 VARCHAR2 IN------------------------------ ----------------------- ------ -------- SCHEMA1 VARCHAR2 IN DEFAULT HANDLE NUMBER IN SCHEMA2 VARCHAR2 IN DEFAULT DOCUMENT CLOB IN NETWORK_LINK1 VARCHAR2 IN DEFAULTPROCEDURE CLOSE NETWORK_LINK2 VARCHAR2 IN DEFAULT参数名称 类型 输入/输出默认值? FUNCTION FETCH_CLOB RETURNS CLOB------------------------------ ----------------------- ------ -------- 参数名称 类型 输入/输出默认值? HANDLE NUMBER IN ------------------------------ ----------------------- ------ --------FUNCTION COMPARE_ALTER RETURNS CLOB HANDLE NUMBER IN参数名称 类型 输入/输出默认值? PROCEDURE FETCH_CLOB------------------------------ ----------------------- ------ -------- 参数名称 类型 输入/输出默认值? OBJECT_TYPE VARCHAR2 IN ------------------------------ ----------------------- ------ -------- NAME1 VARCHAR2 IN HANDLE NUMBER IN NAME2 VARCHAR2 IN XMLDOC CLOB IN/OUT SCHEMA1 VARCHAR2 IN DEFAULT PROCEDURE FETCH_CLOB SCHEMA2 VARCHAR2 IN DEFAULT 参数名称 类型 输入/输出默认值? NETWORK_LINK1 VARCHAR2 IN DEFAULT ------------------------------ ----------------------- ------ -------- NETWORK_LINK2 VARCHAR2 IN DEFAULT HANDLE NUMBER INFUNCTION COMPARE_ALTER_XML RETURNS CLOB XMLDOC CLOB IN/OUT参数名称 类型 输入/输出默认值? DIFFS BOOLEAN OUT------------------------------ ----------------------- ------ -------- FUNCTION OPENC RETURNS NUMBER OBJECT_TYPE VARCHAR2 IN 参数名称 类型 输入/输出默认值? NAME1 VARCHAR2 IN ------------------------------ ----------------------- ------ -------- NAME2 VARCHAR2 IN OBJECT_TYPE VARCHAR2 IN SCHEMA1 VARCHAR2 IN DEFAULT SCHEMA2 VARCHAR2 IN DEFAULT NETWORK_LINK1 VARCHAR2 IN DEFAULT NETWORK_LINK2 VARCHAR2 IN DEFAULT 68/92
  69. 69. DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包: ♠ 世界天天变,Oracle产品天天变;让我们天天学! ♠ 这个包用于对变化进行管理(因为表数据总是变) ♠ 进行数据库对象的比较;同时可以生成修改差异的脚本 ♠ PROCEDURE ADD_DOCUMENT ♠ PROCEDURE CLOSE ♠ FUNCTION COMPARE_ALTER RETURNS CLOB ♠ FUNCTION COMPARE_ALTER_XML RETURNS CLOB ♠ FUNCTION COMPARE_SXML RETURNS CLOB ♠ FUNCTION FETCH_CLOB RETURNS CLOB ♠ PROCEDURE FETCH_CLOB ♠ PROCEDURE FETCH_CLOB ♠ FUNCTION OPENC RETURNS NUMBER 69/92
  70. 70. DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包: ♠ DBMS_METADATA_DIFF.COMPARE_ALTER: DBMS_METADATA_DIFF.COMPARE_ALTER( object_type IN VARCHAR2, name1 IN VARCHAR2, name2 IN VARCHAR2, schema1 IN VARCHAR2 DEFAULT NULL, schema2 IN VARCHAR2 DEFAULT NULL, network_link1 IN VARCHAR2 DEFAULT NULL, network_link2 IN VARCHAR2 DEFAULT NULL) RETURN CLOB; 70/92
  71. 71. DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包: ♠ 世界天天变,Oracle产品天天变;让我们天天学! ♠ 这个包用于对变化进行管理(因为表数据总是变): -- BEGIN SELECT dbms_metadata_diff.compare_alter(TABLE, SERVERS, SERV_INST, USER, USER) INTO c FROM dual; dbms_output.put_line(c); dbms_advisor.create_file(c, CTEMP, compalter.txt); END; / 71/92
  72. 72. DBMS_METADATA_DIFF包♠ DBMS_METADATA_DIFF包: ♠ COMPARE_ALTER_XML用于 : --生成去差异化的脚本(XML格式) DBMS_METADATA_DIFF.COMPARE_ALTER_XML( object_type IN VARCHAR2, name1 IN VARCHAR2, name2 IN VARCHAR2, schema1 IN VARCHAR2 DEFAULT NULL, schema2 IN VARCHAR2 DEFAULT NULL, network_link1 IN VARCHAR2 DEFAULT NULL, network_link2 IN VARCHAR2 DEFAULT NULL) RETURN CLOB; 72/92
  73. 73. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 73/92
  74. 74. DBMS_METADATA包♠ 用DBMS_METADATA包需要注意安全: ♠ 下面是Pete Finnigan给出的样例(1):SQL> connect scott/tigerConnected.SQL> select * from user_role_privs;USERNAME GRANTED_ROLE ADM DEF OS_---------------- ------------------------------ --- --- ---SCOTT CONNECT NO YES NOSCOTT RESOURCE NO YES NOSQL> create or replace function scott.hack return varchar22 authid current_user is3 pragma autonomous_transaction;4 begin5 execute immediate grant dba to scott;6 return ;7 end;8/Function created. 74/92
  75. 75. DBMS_METADATA包♠ 用DBMS_METADATA包需要注意安全: ♠ 下面是Pete Finnigan给出的样例(2):SQL> select sys.dbms_metadata.get_ddl(||scott.hack()||,)from dual;ERROR:ORA-31600: invalid input value ||scott.hack()|| for parameterOBJECT_TYPE in function GET_DDLORA-06512: at "SYS.DBMS_SYS_ERROR", line 105ORA-06512: at "SYS.DBMS_METADATA_INT", line 1536ORA-06512: at "SYS.DBMS_METADATA_INT", line 1900ORA-06512: at "SYS.DBMS_METADATA_INT", line 3606ORA-06512: at "SYS.DBMS_METADATA", line 504ORA-06512: at "SYS.DBMS_METADATA", line 560ORA-06512: at "SYS.DBMS_METADATA", line 1221ORA-06512: at line 1no rows selectedSQL> select * from user_role_privs;USERNAME GRANTED_ROLE ADM DEF OS_-------------- ------------------------------ --- --- ---SCOTT CONNECT NO YES NOSCOTT DBA NO YES NOSCOTT RESOURCE NO YES NO 75/92
  76. 76. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 76/92
  77. 77. DBMS_METADATA包-API♠ 为什么使用 API: ♠ 可能在开发应用代码时需要从数据字典抽取元数据 ♠ 需要操纵元数据(增加列,修改列等) ♠ 转换元成为DDL以便在相同数据库或其他数据库重 建这些对象 ♠ 保持代码的最新版本以便方便技术支持与维护♠ 使用 DBMS_METADATA API: ♠ 返回对象元数据 ♠ 重建一个返回的对象 ♠ 返回不同对象类型 77/92
  78. 78. DBMS_METADATA API♠ 样例1:以函数用DBMS_METADATA: ♠ 1.创建 函数-可返回 EMP 表的元数据:SQL> connect scott/zhaoabc@orcl已连接。SQL> CREATE OR REPLACE FUNCTION get_table_md RETURN CLOB IS 2 -- 定义变量 3 h NUMBER; --handle returned by OPEN 4 th NUMBER; -- handle returned by ADD_TRANSFORM 5 doc CLOB; 6 BEGIN 7 8 -- 指定对象类型. 9 h := DBMS_METADATA.OPEN(TABLE);1011 -- 指定过滤对象.12 DBMS_METADATA.SET_FILTER(h,SCHEMA,SCOTT);13 DBMS_METADATA.SET_FILTER(h,NAME,EMP);1415 -- 请求将元数据转换为DDL.16 th := DBMS_METADATA.ADD_TRANSFORM(h,DDL);1718 -- 取所指定的对象.19 doc := DBMS_METADATA.FETCH_CLOB(h);2021 -- 释放资源.22 DBMS_METADATA.CLOSE(h);23 RETURN doc; 78/9224 END;
  79. 79. DBMS_METADATA API ♠ 样例1:以函数用DBMS_METADATA: ♠ 2.运行 函数-可返回 EMP 表的元数据:SQL> SET PAGESIZE 0SQL> SET LONG 1000000SQL> SELECT get_table_md FROM dual;CREATE TABLE "SCOTT"."EMP" ( "EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICSSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "USERS" ENABLE, CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGINGSTORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)TABLESPACE "USERS" 79/92
  80. 80. DBMS_METADATA API ♠ 样例2:以过程用DBMS_METADATA: ♠ 1.创建存储过程:SQL> CREATE TABLE my_metadata (md clob); 17 -- 取对象信息.表已创建。 18 LOOPSQL> CREATE OR REPLACE PROCEDURE get_Scott_md IS 19 doc := DBMS_METADATA.FETCH_CLOB(h); 2 -- Define local variables 20 3 h NUMBER; -- handle returned by OPEN 21 -- 当无对象时, FETCH_CLOB 返回 NULL. 4 th NUMBER; -- handle returned by ADD_TRANSFORM 22 EXIT WHEN doc IS NULL; 5 doc CLOB; -- metadata is returned in a CLOB 23 6 BEGIN 24 -- 存储元数据到一个表中. 7 25 INSERT INTO my_metadata(md) VALUES (doc); 8 -- 指定对象类型. 26 COMMIT; 9 h := DBMS_METADATA.OPEN(TABLE); 27 END LOOP;10 2811 -- 指定过滤的模式. 29 -- 释放资源.12 DBMS_METADATA.SET_FILTER(h,SCHEMA,SCOTT); 30 DBMS_METADATA.CLOSE(h);13 31 END;14 -- 指定将元数据转换为DDL. 32 /15 th := DBMS_METADATA.ADD_TRANSFORM(h,DDL);16 过程已创建。 80/92
  81. 81. DBMS_METADATA API ♠ 样例2:以过程用DBMS_METADATA: ♠ 2.运行存储过程:SQL> EXECUTE get_Scott_md;PL/SQL 过程已成功完成。SQL> SET LONG 9000000SQL> SET PAGES 0SQL> SELECT * FROM my_metadata; CREATE TABLE "SCOTT"."MY_METADATA" ( "MD" CLOB ) 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"… 81/92
  82. 82. DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 1.创建具有差异的样例表: SQL> CREATE TABLE TAB1 2 ( "EMPNO" NUMBER(4,0), 3 "ENAME" VARCHAR2(10), 4 "JOB" VARCHAR2(9), 5 "DEPTNO" NUMBER(2,0) 6); Table created. SQL> CREATE TABLE TAB2 2 ( "EMPNO" NUMBER(4,0) PRIMARY KEY ENABLE, 3 "ENAME" VARCHAR2(20), 4 "MGR" NUMBER(4,0), 5 "DEPTNO" NUMBER(2,0) 6); Table created. 82/92
  83. 83. DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 2.创建函数获取表的SXML信息: SQL> CREATE OR REPLACE FUNCTION get_table_sxml(name IN VARCHAR2) RETURN CLOB IS 2 open_handle NUMBER; 3 transform_handle NUMBER; 4 doc CLOB; 5 BEGIN 6 open_handle := DBMS_METADATA.OPEN(TABLE); 7 DBMS_METADATA.SET_FILTER(open_handle,NAME,name); 8 -- 9 -- Use the SXML transform to convert XML to SXML 10 -- 11 transform_handle := DBMS_METADATA.ADD_TRANSFORM(open_handle,SXML); 12 -- 13 -- Use this transform parameter to suppress physical properties 14 -- 15 DBMS_METADATA.SET_TRANSFORM_PARAM(transform_handle,PHYSICAL_PROPERTIES, 16 FALSE); 17 doc := DBMS_METADATA.FETCH_CLOB(open_handle); 18 DBMS_METADATA.CLOSE(open_handle); 19 RETURN doc; 20 END; 21 / 83/92
  84. 84. DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 3.运行函数获取表的SXML信息: SQL> SELECT get_table_sxml(TAB1) FROM dual; <TABLE xmlns="http://xmlns.oracle.com/ku" version="1.0"> <SCHEMA>SCOTT</SCHEMA> <NAME>TAB1</NAME> <RELATIONAL_TABLE> <COL_LIST> <COL_LIST_ITEM> <NAME>EMPNO</NAME> <DATATYPE>NUMBER</DATATYPE> <PRECISION>4</PRECISION> <SCALE>0</SCALE> </COL_LIST_ITEM> <COL_LIST_ITEM> <NAME>ENAME</NAME> <DATATYPE>VARCHAR2</DATATYPE> <LENGTH>10</LENGTH> </COL_LIST_ITEM> <COL_LIST_ITEM> <NAME>JOB</NAME> <DATATYPE>VARCHAR2</DATATYPE> <LENGTH>9</LENGTH> </COL_LIST_ITEM> <COL_LIST_ITEM> <NAME>DEPTNO</NAME> <DATATYPE>NUMBER</DATATYPE> <PRECISION>2</PRECISION> <SCALE>0</SCALE> </COL_LIST_ITEM> </COL_LIST> 84/92 </RELATIONAL_TABLE>
  85. 85. DBMS_METADATA_DIFF API♠ 样例1:以函数用DBMS_METADATA_DIFF: ♠ 3.运行函数获取表的SXML信息: SQL> SELECT get_table_sxml(TAB2) FROM dual; </COL_LIST_ITEM> <TABLE xmlns="http://xmlns.oracle.com/ku" <COL_LIST_ITEM> version="1.0"> <NAME>DEPTNO</NAME> <SCHEMA>SCOTT</SCHEMA> <DATATYPE>NUMBER</DATATYPE> <NAME>TAB2</NAME> <PRECISION>2</PRECISION> <RELATIONAL_TABLE> <SCALE>0</SCALE> <COL_LIST> </COL_LIST_ITEM> <COL_LIST_ITEM> </COL_LIST> <NAME>EMPNO</NAME> <PRIMARY_KEY_CONSTRAINT_LIST> <DATATYPE>NUMBER</DATATYPE> <PRIMARY_KEY_CONSTRAINT_LIST_ITEM> <PRECISION>4</PRECISION> <COL_LIST> <SCALE>0</SCALE> <COL_LIST_ITEM> </COL_LIST_ITEM> <NAME>EMPNO</NAME> <COL_LIST_ITEM> </COL_LIST_ITEM> <NAME>ENAME</NAME> </COL_LIST> <DATATYPE>VARCHAR2</DATATYPE> </PRIMARY_KEY_CONSTRAINT_LIST_ITEM> <LENGTH>20</LENGTH> </PRIMARY_KEY_CONSTRAINT_LIST> </COL_LIST_ITEM> </RELATIONAL_TABLE> <COL_LIST_ITEM> </TABLE> <NAME>MGR</NAME> 1 row selected. <DATATYPE>NUMBER</DATATYPE> <PRECISION>4</PRECISION> <SCALE>0</SCALE> 85/92
  86. 86. 小结♠ DBMS_METADATA主要用途 : ♠ 在SQL>下使用 ♠ 开发人员与应用迁移人员及DBA都应该掌握 ♠ 需要配置SQL>下的环境变量♠ DBMS_METADATA-API : ♠ DBMS_METADATA可在PL/SQL下使用 ♠ 也可在目前流行的4GL使用 86/92
  87. 87. 小结♠ 返回的结果脚本可用于程序设计: ♠ 模式修订的源代码 ♠ 修改模式的拷贝 ♠ 删除、修改、重建对象的应用♠ DBMS_METADATA不足 : ♠ DBMS_METADATA可返回令人费解的DDL ♠ 存在某些安全问题 87/92
  88. 88. 内容♠ DBMS_METADATA的版本差异♠ DBMS_METADATA.GET_DDL♠ DBMS_METADATA包特殊功能♠ DBMS_METADATA- 11g新功能♠ DBMS_METADATA_DIFF包♠ DBMS_METADATA包与安全问题♠ 用DBMS_METADATA包API♠ DBMS_METADATA包使用常见问题 88/92
  89. 89. 使用常见错误样例♠ DBMS_METADATA.get_ddl没有设置SQL环境变量 ♠ 需要注意下面设置 : LINESIZE 显示行宽(字符数量) PAGESIZE 0 每页显示行书 FEEDBACK OFF 反馈行数量的不要 LONG 100000 CLOB 可容纳 TRIMSPOOL ON 去除行后面的空字符 COLUMN WORD_WRAP 确保断点不在字的中间(不将单词拆开) 89/92
  90. 90. 使用常见错误样例♠ DBMS_METADATA.get_ddl ♠ 注意语法-大小写 : Correct dbms_metadata.get_ddl(VIEW,C_VIEW,OE) Error dbms_metadata.get_ddl(view,C_VIEW,OE) ERROR: ORA-31600: invalid input value view for parameter OBJECT_TYPE in function GET_DDL ORA-06512: at "SYS.DBMS_METADATA", line 2681 ORA-06512: at "SYS.DBMS_METADATA", line 2732 ORA-06512: at "SYS.DBMS_METADATA", line 4333 ORA-06512: at line 1 90/92
  91. 91. 使用常见错误样例♠ DBMS_METADATA.get_ddl ♠ 注意语法-参数位置 : Correct dbms_metadata.get_ddl(VIEW,C_VIEW,OE) Error dbms_metadata.get_ddl(object_type=>VIEW,name=>C_VIEW,schema=>OE) * ERROR at line 2: ORA-00907: missing right parenthesis 91/92
  92. 92. 使用常见错误样例♠ DBMS_METADATA.get_ddl ♠ 安全问题-授权使用? : Connect sys as sysdba SQL> select * from dba_tab_privs 2* where table_name = DBMS_METADATA SQL> / GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE ---------- --------- ---------------- ------------ ------------ --- --- PUBLIC SYS DBMS_METADATA SYS EXECUTE NO NO 92/92
  93. 93. 使用常见错误样例♠ DBMS_METADATA.get_ddl ♠ 安全问题-没有权限的用户? ♠ 授予SELECT_CATALOG_ROLE权限的用户 : GRANT select, insert, update, delete, alter ON locations TO oe; connect oe/demo; SELECT DBMS_METADATA.GET_DDL(TABLE, LOCATIONS, HR) ddl_call FROM dual; ERROR: ORA-31603: object "LOCATIONS" of type TABLE not found in schema "HR" ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105 ORA-06512: at "SYS.DBMS_METADATA", line 2805 ORA-06512: at "SYS.DBMS_METADATA", line 4333 ORA-06512: at line 1 93/92
  94. 94. 使用常见错误样例♠ DBMS_METADATA.get_ddl ♠ 在SQL*Plus 下使用的设置 : LINESIZE Wide enough to make the output readable. I usually set it to 125. PAGESIZE 0 to suppress all heading information FEEDBACK OFF to suppress rows information LONG At least 100000 for the CLOB output TRIMSPOOL ON to trim any following spaces COLUMN WORD_WRAP to insure breaks are not in the middle of words. This also suppresses some of the formatting used by DBMS_METADATA. 94/92
  95. 95. 使用常见错误样例♠ DBMS_METADATA.get_ddl ♠ 设置 : SET LINESIZE 132 PAGESIZE 0 FEEDBACK off VERIFY off TRIMSPOOL on LONG 1000000 COLUMN ddl_string FORMAT A100 WORD_WRAP EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, STORAGE,false); EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, PRETTY,true); EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, SQLTERMINATOR,true); EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, REF_CONSTRAINTS,false); 95/92
  96. 96. 参考资源♠ Oracle 原厂: ♠ Oracle® Database PL/SQL Packages and Types Reference 11g Release 2 (11.2) E10577-04 ♠ Oracle® Database Utilities 11g Release 2 (11.2) Part Number E10701-02♠ Oracle® Database PL/SQL Packages and Types Reference 11 g Release 2 (11.2)E10577-04 96/92

×