如何批量获取表结构存储

简介:

当我们想要查看某个表或者是表空间的DDL的时候,可以利用 dbms_metadata.get_ddl 这个包来查看。

dbms_metadata包中的get_ddl函数详细参数:

GET_DDL函数返回创建对象的原数据的DDL语句,详细参数如下
-- object_type --- 需要返回原数据的DDL语句的对象类型
-- name --- 对象名称
-- schema --- 对象所在的Schema,默认为当前用户所在所Schema
-- version --- 对象原数据的版本
-- model --- 原数据的类型默认为ORACLE
-- transform. --- XSL-T transform. to be applied.
-- RETURNS --- 对象的原数据默认以CLOB类型返回

dbms_metadata包中的get_ddl函数定义:

FUNCTION get_ddl (

object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform. IN VARCHAR2 DEFAULT 'DDL'

) RETURN CLOB;

注意:如果使用sqlplus需要进行下列格式化,特别需要对long进行设置,否则无法显示完整的SQL
set linesize 120
set pages 1000
set long 10000


查看创建用户表的SQL
查看当前用户表的SQL:

SELECT DBMS_METADATA.GET_DDL('TABLE','EMP') FROM DUAL;

查看其他用户表的SQL:

SELECT DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT') FROM DUAL;

查看创建用户索引的SQL

查看所需表的索引:

SELECT INDEX_NAME,INDEX_TYPE,TABLE_NAME FROM user_indexes WHERE table_name='EMP';

查看当前用户索引的SQL:

SELECT DBMS_METADATA.GET_DDL ('INDEX','PK_DEPT') FROM DUAL;

查看其他用户索引的SQL:

SELECT DBMS_METADATA.GET_DDL ('INDEX','PK_DEPT','SCOTT') FROM DUAL;

查看创建主键的SQL

查看所需表的约束:

SELECT OWNER,TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE

FROM user_constraints WHERE TABLE_NAME='EMP';

查看创建主键的SQL:

SELECT DBMS_METADATA.GET_DDL('CONSTRAINT','EMP_PK') FROM DUAL;

查看创建外键的SQL:

SELECT DBMS_METADATA.GET_DDL('REF_CONSTRAINT','EMP_FK_DEPT') FROM DUAL;

查看创建VIEW的语句

查看当前用户视图的SQL:

SELECT DBMS_METADATA.GET_DDL('VIEW', 'MY_TABLES') FROM DUAL;

查看其他用户视图的SQL:

SELECT DBMS_METADATA.GET_DDL('VIEW', 'MY_TABLES','SCOTT') FROM DUAL;

查看创建视图的SQL也可以:

SELECT TEXT FROM user_views WHERE view_name='VIEW_NAME';


DBMS_METADATA.GET_DDL的一些使用技巧

得到一个用户下的所有表,索引,存储过程,函数的ddl语句:

SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.OBJECT_NAME)
FROM USER_OBJECTS U
WHERE U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE','FUNCTION');

得到所有表空间的ddl语句:

SELECT DBMS_METADATA.GET_DDL('TABLESPACE',TS.tablespace_name)
FROM DBA_TABLESPACES TS;

得到所有创建用户的ddl语句:

SELECT DBMS_METADATA.GET_DDL('USER',U.username)
FROM DBA_USERS U;


利用DBMS_METADATA.GET_DDL包得到数据库的对象的ddl脚本

获取单个的建表、视图和建索引的语法:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF / 显示文件中的命令,只显示执行结果 /

/ SET ECHO ON 显示文件中的每条命令及执行结果 /

SET LONG 10000

SPOOL spool/dept.sql

select dbms_metadata.get_ddl('TABLE','TABLE_NAME','SCOTT') from dual;
select dbms_metadata.get_ddl('VIEW','VIEW_NAME','SCOTT') from dual;
select dbms_metadata.get_ddl('INDEX','INDEX_NAME','SCOTT') from dual;

SPOOL OFF;

获取一个SCHEMA下的所有建表、视图和建索引的语法,以scott为例:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF
SET LONG 10000

SPOOL spool/schema.sql

connect scott/tiger;
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;
SELECT DBMS_METADATA.GET_DDL('VIEW',u.VIEW_name) FROM USER_VIEWS u;
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name) FROM USER_INDEXES u;

SPOOL OFF;

获取某个SCHEMA的建全部存储过程的语法:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF
SET LONG 10000

SPOOL spool/procedure.sql
SELECT DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name)

FROM user_objects u WHERE object_type='PROCEDURE';

SPOOL OFF;

获取某个SCHEMA的建全部函数的语法:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF
SET LONG 10000

SPOOL spool/function.sql

SELECT DBMS_METADATA.GET_DDL('FUNCTION',u.object_name)

FROM user_objects u WHERE object_type='FUNCTION';

SPOOL OFF;


执行DBMS_METADATA.GET_DDL报ORA-39212的解决方法

以sys登陆,执行DBMS_METADATA.get_ddl得到某个表空间的元数据报错
select DBMS_METADATA.get_ddl('TABLESPACE','PDA') from dual;
ERROR:
ORA-39212: installation error: XSL stylesheets not loaded correctly
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_METADATA_INT", line 7428
ORA-06512: at "SYS.DBMS_METADATA_INT", line 7477
ORA-06512: at "SYS.DBMS_METADATA_INT", line 9495
ORA-06512: at "SYS.DBMS_METADATA", line 1920
ORA-06512: at "SYS.DBMS_METADATA", line 2793

.........

解决方法:
以sysdba权限的用户登陆执行以下语句:

SQL> exec dbms_metadata_util.load_stylesheets;

PL/SQL procedure successfully completed.

再次执行成功:

SQL> selectDBMS_METADATA.get_ddl('TABLESPACE','PDA') from dual;

之前遇到的一个问题是有一个分区表,分区记录将近有16W条,导致获取表结构的时候异常卡死,这个也需要注意一下获取ddl语句的时候


本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/2058354


相关文章
|
Linux
Linux:ln创建删除软连接
Linux:ln创建删除软连接
2592 0
|
存储 数据挖掘 数据库
【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】
【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】
|
SQL 运维 网络协议
【运维】阿里云宝塔面板部署JavaWeb项目
【运维】阿里云宝塔面板部署JavaWeb项目
1726 0
【运维】阿里云宝塔面板部署JavaWeb项目
|
7月前
|
存储 缓存 JSON
小红书item_get - 获得商品详情接口对接全攻略:从入门到精通
小红书item_get接口是获取商品详情的核心工具,支持获取价格、库存、销量、图文等数据,广泛用于竞品分析、电商选品与舆情监测。因无官方公开接口,需通过合规第三方服务商接入。本文详解接口参数、调用流程、Python实现、调试技巧及生产优化策略,涵盖签名生成、异常处理、批量请求优化与合规要点,助力开发者高效稳定对接,适用于电商数据分析与聚合平台开发。(239字)
|
Java Maven
maven打包,java内存竟然要设置16G(-Xmx16384m)
maven打包,java内存竟然要设置16G(-Xmx16384m)
857 0
|
编解码 PyTorch 定位技术
Transformers 4.37 中文文档(六十七)(2)
Transformers 4.37 中文文档(六十七)
724 0
|
人工智能 自然语言处理 API
阿里云百炼上线FLUX文生图模型中文优化版,可免费调用!
阿里云百炼上线FLUX文生图模型中文优化版,可免费调用!
2110 6
|
存储 网络协议
计算机基础之MB、Mb、MBps、Mbps
计算机基础之MB、Mb、MBps、Mbps
|
消息中间件 设计模式 缓存
Redis发布订阅:美丽的陷阱与不宜之境
Redis发布订阅:美丽的陷阱与不宜之境
1313 1
|
弹性计算 大数据 测试技术
2024年阿里云服务器租用价格表(CPU/内存/带宽/磁盘收费标准)
2024年阿里云服务器租用价格表更新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服务器30元3个月,幻兽帕鲁4核16G和8核32G服务器配置,云服务器ECS可以选择经济型e实例、通用算力u1实例、ECS计算型c7、通用型g7、c8i、g8i等企业级实例规格。阿里云百科分享阿里云服务器租用费用最新报价