抓取oracle建表语句及获取建表ddl语句
抓取oracle建表语句及获取建表ddl语句
1.抓取代码如下:
1.1.产生表的语法资料
DECLARE
-- v_notPartTable VARCHAR2(1000):= '&2';
--v_sql CLOB;
v_partType VARCHAR2(20);
v_partColumn VARCHAR2(50);
v_subPartType VARCHAR2(50);
v_subPartSql VARCHAR2(4000);
v_seq NUMBER := 10;
BEGIN
FOR v_cur in (
SELECT table_name,partitioned,t.TABLESPACE_NAME,t.PCT_FREE, t.LOGGING, t.CACHE FROM user_tables t
where table_name = 'TEST1'
) LOOP
v_seq := v_seq + 1;
INSERT INTO tmp_tabsql(seq,table_name,table_sql) VALUES(v_seq, v_cur.table_name, 'CREATE TABLE ' || v_cur.table_name || '(' );
--columns
FOR v_column IN (
SELECT CASE WHEN REGEXP_LIKE (COLUMN_NAME,'^\d+$') THEN '"'||COLUMN_NAME||'"' ELSE COLUMN_NAME END COLUMN_NAME, DATA_TYPE,DATA_LENGTH, DATA_PRECISION,DATA_SCALE,COLUMN_ID
FROM user_tab_columns
WHERE table_name = v_cur.table_name
ORDER BY column_id ASC
) LOOP
v_seq := v_seq + 1;
INSERT INTO tmp_tabsql(seq, table_name, table_sql) VALUES(v_seq, v_cur.table_name,
CASE WHEN v_column.column_id <> 1 THEN ' ,' END
|| v_column.column_name || ' ' || v_column.data_type
|| CASE v_column.data_type WHEN 'TIMESTAMP(6)' THEN '' WHEN 'DATE' THEN ''
WHEN 'CLOB' THEN '' WHEN 'BLOB' THEN ''
WHEN 'NUMBER' THEN
CASE
WHEN v_column.data_scale is NOT NULL AND v_column.data_precision IS NOT NULL THEN '('||v_column.data_precision||','||v_column.data_scale||')'
WHEN v_column.data_precision IS NOT NULL THEN '(' || v_column.data_precision|| ')'
END
ELSE
CASE WHEN v_column.data_length IS NOT NULL THEN '(' || v_column.data_length || ')' END
END
);
END LOOP;
v_seq := v_seq + 1;
INSERT INTO tmp_tabsql(seq, table_name, table_sql) VALUES(v_seq, v_cur.table_name, ')');
IF v_cur.partitioned = 'YES' THEN
SELECT t.partitioning_type, t.subpartitioning_type , tk.column_name
INTO v_partType, v_subPartType, v_partColumn
FROM User_Part_Tables t, User_Part_Key_Columns tk
where t.table_name = tk.name
AND t.table_name = v_cur.table_name
;
v_seq := v_seq + 1;
INSERT INTO tmp_tabsql(seq, table_name, table_sql) VALUES(v_seq, v_cur.table_name,
' pctfree 0 nologging partition by ' || v_partType ||'('||v_partColumn||')' );
-- subpartition
v_subPartSql := '';
IF v_subPartType <> 'NONE' THEN
SELECT t.column_name INTO v_partColumn FROM user_subpart_key_columns t
WHERE t.name = v_cur.table_name
;
v_subPartSql := 'subpartition by '|| v_subPartType ||'('|| v_partColumn ||') subpartition template (' ||CHR(10);
FOR v_tmp in (SELECT t.subpartition_name, t.high_bound, t.subpartition_position
FROM User_Subpartition_Templates t
WHERE TABLE_NAME = v_cur.table_name
ORDER BY t.subpartition_position ASC
) LOOP
v_subPartSql := v_subPartSql || CASE WHEN v_tmp.subpartition_position > 1 THEN CHR(10) ||' ,' END
|| 'subpartition '|| v_tmp.subpartition_name || ' values (' || v_tmp.high_bound || ')'
;
END LOOP;
v_subPartSql := v_subPartSql || CHR(10) || ')' ||CHR(10);
END IF;
v_seq := v_seq + 1;
INSERT INTO tmp_tabsql(seq, table_name, table_sql) VALUES(v_seq, v_cur.table_name,
v_subPartSql || '(partition P2011010100 values less than (to_date(''2011-01-01'',''yyyy-mm-dd'')));'
);
ELSE
v_seq := v_seq + 1;
INSERT INTO tmp_tabsql(seq,table_name,table_sql) VALUES(v_seq, v_cur.table_name,
' TABLESPACE ' || v_cur.tablespace_name
|| ' PCTFREE ' || v_cur.pct_free
|| CASE TRIM(v_cur.logging) WHEN 'NO' THEN ' NOLOGGING' END
|| CASE trim(v_cur.cache) WHEN 'Y' THEN ' CACHE' END
||';'
)
;
END IF;
COMMIT;
END LOOP;
END;
/
spool &1
select table_sql from (
SELECT 'set echo off;' table_sql,0 seq from dual
UNION ALL
SELECT 'set feedback off;', 1 seq FROM dual
union ALL
SELECT table_sql,seq FROM tmp_tabsql
UNION ALL
SELECT 'exit;',9999999999 seq from dual
) order by seq asc;
spool OFF;
drop TABLE tmp_tabsql PURGE;
EXIT;
2 获取建表ddl语句
2.1.获取ddl ##('TABLE','表名','用户名')
SELECT DBMS_METADATA.GET_DDL('TABLE','ODRM','S6MISM') FROM DUAL;
2.2. 得到一个用户下的所有表,索引,存储过程的ddl
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name) FROM USER_OBJECTS u where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE');
2.3.得到所有表空间的ddl语句
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name) FROM DBA_TABLESPACES TS;
2.4.得到所有创建用户的ddl
SELECT DBMS_METADATA.GET_DDL('USER',U.USERNAME) FROM DBA_USERS U;
抓取oracle建表语句及获取建表ddl语句的更多相关文章
- Oracle获取干净的建表DDL语句,不含其它存储、表空间、段属性
早上一个同事资讯怎么获取到建表语句而且是不带存储那种SQL.Oracle自己提供了一个函数DBMS_METADATA.GET_DDL,但是获取到的建表语句含有存储.表空间.以及一些其他段的属性.如图: ...
- 三种常用的MySQL建表语句(转)
MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1( ...
- ORACLE 建表语句(表名及字段名大写)
ORACLE建表时如果表名或者字段名存在大小写同时存在的情况下,默认为区分大小写,此时在select/updata等操作时需要在表名或者字段名上添加双引号,否则会报"视图不存在"的 ...
- mysql和oracle建表语句以及数据类型的区别
1.mysql和oracle建表语句的区别 mysql DROP TABLE IF EXISTS `order`;CREATE TABLE `order` ( `id` int(11) NOT NU ...
- sqlserver 建表语句,获取建表语句的存储过程,包括排序规则,索引,字段说明,支持同时生成多个表
先创建一个分割表名的分割函数 --表值函数用以截取字符串 --如果为其添加一列主键id,则其顺序就会固定了 create FUNCTION [Split](@text NVARCHAR(max)) ) ...
- MySQL建表语句生成Golang代码
1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码.基础的增删改查代码(基础的增删改查服务可以划入DAO(Data Access ...
- sqlite建表语句(特别是外键问题)
原创 sqlite建表语句(特别是外键问题) 下面图表示两个表关系: //表1User_invitecreate table User_invite(Invite_id INTEGER PRIMAR ...
- Python导出MySQL数据库中表的建表语句到文件
为了做数据对象的版本控制,需要将MySQL数据库中的表结构导出成文件进行版本化管理,试写了一下,可以完整导出数据库中的表结构信息 # -*- coding: utf-8 -*- import os i ...
- 借助python工具从word文件中抽取相关表的定义,最后组装建表语句-非常好
借助python工具从word文件中抽取表的定义,最后组装建表语句-非常好 --如有转载请以超链接的方式注明原文章出处,谢谢大家.请尊重每一位乐于分享的原创者 1.python脚本 ## -*- co ...
随机推荐
- 能量项链 洛谷P1063
1154 能量项链 2006年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在Mars星球上,每个M ...
- 静态文件与APP
目录 静态文件的配置和使用 什么是静态文件? 为什么使用静态文件 如何配置,使用静态文件 静态文件相关(动态配置) app创建预注册 app指什么? 创建一个APP 注册app app文件作用 app ...
- mysql--浅谈子查询1
这是对自己学习燕十八老师mysql教程的总结,非常感谢燕十八老师. 依赖软件:mysql5.6 系统环境:win 子查询概念 子查询就是在原有的查询语句中嵌入新的查询 子查询分类 1.where型子查 ...
- 黑马旅游网 url-pattern不加斜杠报错 java.util.concurrent.ExecutioException: org.apache.catalina.LifecycleException
- 登录案例version1 基本登录+验证码
package com.frxx.web.servlet; import com.frxx.domain.User; import com.frxx.service.impl.UserServiceI ...
- 页面出现滚动条时,body里面的内容不能自动居中?
弹窗后允许页面滚动 这种方式通常使用 position: absolute; ,可以看看我做的这个 Demo.主要用来应对弹窗内容很大很多的情况,超过了屏幕的宽高需要产生滚动条来方便浏览者查看.有一些 ...
- 15.更新和删除数据--SQL
一.更新数据 更新(修改)表中的数据,可以使用UPDA TE语句.有两种使用UPDA TE的方式: 更新表中的特定行: 更新表中的所有行. 警告:不要省略WHERE子句 在使用UPDA TE时一定要细 ...
- B.DongDong认亲戚
链接:https://ac.nowcoder.com/acm/contest/904/B 题意: DongDong每年过春节都要回到老家探亲,然而DongDong记性并不好,没法想起谁是谁的亲戚(定义 ...
- JS代码运行延迟
还是上篇文章的项目. 现在是屏幕上需要显示九张图表,刚好用一张3X3的表格来显示.但是负责这块内容的同事始终没法让九张图表同时显示,有些图表的位置空了出来. 大家百思不得其解,最后只得求助技术经理. ...
- Table行合并操作
此方法不可取,但几天心血 保留,已有新想法,稍后会出一个完善的Table行列合并方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...