从 oracle 数据库导数到到 hive 大数据平台,需要按照大数据平台的数据规范,重新生成建表的 SQL 语句,方便其间,写了一个自动生成SQL的存储过程。

① 创建一张表,用来存储源表的结构,以便进行数据处理(可以用临时表,创建表是为了方便核对数据);

 create table T_P_TABLE_NAME_TEMP
(
owner VARCHAR2(30) not null,
table_name VARCHAR2(30) not null,
tab_comments VARCHAR2(4000),
column_name VARCHAR2(30) not null,
data_type VARCHAR2(106),
col_comments VARCHAR2(4000)
);

② 还需要一张表来存储生成的SQL语句。

 -- Create table
create table T_SQL
(
scsj DATE,
sqlyj VARCHAR2(4000),
table_name VARCHAR2(100) not null,
mxyj VARCHAR2(4000)
)
-- Add comments to the columns
comment on column T_SQL.scsj
is '生成时间';
comment on column T_SQL.sqlyj
is 'SQL语句';
comment on column T_SQL.table_name
is '表名';

③ 存储过程代码。

 create or replace procedure p_ddpt_sql_init(p_table_name varchar2, --输入表名,必须大写
p_error_no out int, --错误编号
p_error_info out varchar2 --错误信息
) --调度平台 建表语句生成 as
nb_begindate date;
nb_enddate date;
v_count number; v_update_sql varchar(2000);
v_temp_sql varchar(2000);
v_detail_sql varchar(2000);
v_out_sql varchar(2000); v_owner varchar(2000);
v_table_name varchar(2000);
v_tab_comments varchar(2000);
v_column_name varchar(2000);
v_data_type varchar(2000);
v_col_comments varchar(2000);
begin p_error_no := 0;
p_error_info := ''; nb_begindate := sysdate; v_out_sql := 'use dm_mms;'||chr(13)||
'drop table '||p_table_name||';'||chr(13)||
'create table '||p_table_name||'('||chr(13); execute immediate 'truncate table t_p_table_name_temp'; insert into t_p_table_name_temp
(owner, table_name, tab_comments, column_name, data_type, col_comments)
select a.owner,
a.table_name,
c.comments tab_comments,
a.column_name,
a.data_type,
b.comments col_comments
from all_tab_columns a, all_col_comments b, all_tab_comments c
where a.table_name = b.table_name
and a.owner = b.owner
and a.column_name = b.column_name
and a.table_name = c.table_name
and a.owner = c.owner
and c.table_type = 'TABLE'
and a.table_name = p_table_name
order by a.table_name;
commit; update t_p_table_name_temp set data_type = 'string' where data_type = 'VARCHAR2';
update t_p_table_name_temp set data_type = 'double' where data_type = 'NUMBER';
commit; update t_p_table_name_temp set data_type = 'string' where column_name = 'YGBH';
update t_p_table_name_temp set data_type = 'string' where column_name = 'DWBH';
update t_p_table_name_temp set data_type = 'string' where column_name = 'FGS';
update t_p_table_name_temp set data_type = 'string' where column_name = 'KHYF';
update t_p_table_name_temp set data_type = 'string' where column_name = 'SFYL';
update t_p_table_name_temp set data_type = 'string' where column_name = 'RSSJ';
update t_p_table_name_temp set data_type = 'string' where column_name = 'YLSC';
update t_p_table_name_temp set data_type = 'string' where column_name = 'YGZT';
update t_p_table_name_temp set data_type = 'string' where column_name = 'SYYLYF';
update t_p_table_name_temp set data_type = 'string' where column_name = 'YGLX';
update t_p_table_name_temp set data_type = 'string' where column_name = 'KHBH';
update t_p_table_name_temp set data_type = 'string' where column_name = 'CSMRZ';
update t_p_table_name_temp set data_type = 'string' where column_name = 'CSLX';
update t_p_table_name_temp set data_type = 'string' where column_name like '%YF';
update t_p_table_name_temp set data_type = 'string' where column_name like '%RQ';
update t_p_table_name_temp set data_type = 'string' where column_name like '%BH';
commit; --v_update_sql := 'update'|| p_table_name || ' set yj=replace(yj,''chr(13)'',chr(13)) where table_name = '''||p_table_name ||'''';
dbms_output.put_line(v_update_sql); for c_row in (SELECT * FROM t_p_table_name_temp)
loop v_owner := c_row.owner;
v_table_name := c_row.table_name;
v_tab_comments := c_row.tab_comments;
v_column_name := c_row.column_name;
v_data_type := c_row.data_type;
v_col_comments := c_row.col_comments; if v_temp_sql is null then
v_temp_sql := v_column_name ||' '||v_data_type || ' comment '||'"'||v_col_comments||'"';
v_detail_sql := v_column_name;
else
v_temp_sql := v_temp_sql ||','||chr(13) || v_column_name ||' '||v_data_type || ' comment '||'"'||v_col_comments||'"';
v_detail_sql := v_detail_sql||',' || chr(13) || v_column_name;
end if; end loop; --select distinct tab_comments into v_tab_comments from t_p_table_name_temp; v_out_sql := v_out_sql || v_temp_sql ||') '||chr(13) ||'comment '||'"'|| v_tab_comments||'"'||chr(13);
v_detail_sql := 'select ' || chr(13) || v_detail_sql || ' from '|| v_owner ||'.' ||v_table_name; v_out_sql:=v_out_sql||'partitioned by(busi_date string) '||';'; nb_enddate := sysdate; delete t_sql where table_name = p_table_name;
insert into t_sql
(scsj, sqlyj, table_name, mxyj)
values
(nb_enddate, v_out_sql, p_table_name, v_detail_sql);
commit; p_error_no := 1;
p_error_info := '调度平台建表语句生成成功!';
--p_insert_log_info('', nb_begindate, nb_enddate, '调度平台SQL语句生成', 'p_ddpt_sql_init', p_error_no, p_error_info);
exception
when others then
p_error_no := -1;
p_error_info := '调度平台建表语句生成失败!' || sqlerrm;
--p_insert_log_info('', nb_begindate, nb_enddate, '奖励38 调度平台SQL语句生成', 'p_ddpt_sql_init', p_error_no, p_error_info);
rollback;
end p_ddpt_sql_init;

执行这段代码,生成的SQL语句会存储在T_SQL表中。

Oracle 自动生成hive建表语句的更多相关文章

  1. 利用MySQL原数据信息批量转换指定库数据表生成Hive建表语句

    1.写出文件工具类 package ccc.utile; import java.io.*; /** * @author ccc * @version 1.0.0 * @ClassName Write ...

  2. 脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明

    常规建表语句: CREATE TABLE `test_table` ( `id` int(11) NOT NULL, `name` char(64) NOT NULL, `password` char ...

  3. 用PowerDesigner生成自定义建表语句

    原文:用PowerDesigner生成自定义建表语句 我们经常用PowerDesigner来进行数据库表结构的设计,并且设计出来的表比较直观的看出之间的相互关系,方便理解:但其自动生成的脚本并不一定符 ...

  4. hive查看建表语句

    查看hive建表语句:show create table tablename; 查看hive表结构:describe  tablename; 简写:desc tablename;

  5. Mysql元数据生成Hive建表语句注释脚本

    在将数据从Mysql 等其他关系型数据库 抽取到Hive 表中时,需要同步mysql表中的注释,以下脚本可以生成hive表字段注释修改语句. 注:其他关系型数据库如:oracle 可以通过相同的思路, ...

  6. 获取impala下所有的数据库建表语句

    方法一: 现在的导出还是有缺陷的,导出的文件中还是存在其他不必要的信息 #!/bin/bash ##获取数据库 databases=$(hive -e "show databases; ex ...

  7. 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句

    在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...

  8. Oracle获取干净的建表DDL语句,不含其它存储、表空间、段属性

    早上一个同事资讯怎么获取到建表语句而且是不带存储那种SQL.Oracle自己提供了一个函数DBMS_METADATA.GET_DDL,但是获取到的建表语句含有存储.表空间.以及一些其他段的属性.如图: ...

  9. 批量导出hive表的建表语句

    转的这里的 首先先导出所有的table表 hive -e "use xxxdb;show tables;" > tables.txt 然后再使用hive内置语法导出hive表 ...

随机推荐

  1. 使用Collectd + InfluxDB + Grafana进行JMX监控

    我们已经看到使用Collectd监控CPU /内存利用率(本文).但它没有提供所有信息来确定性能问题的瓶颈.在本文中,我们将使用Collectd Java插件来使用其JMX技术来监视和管理Java虚拟 ...

  2. 关于node中的global,箭头函数的this的一个小问题

    this一直是一个JS中的困扰问题,这次在跑JS精粹的代码的时候顺带发现了Node里面全局变量的问题 var x = 1; var myObj = { x: 2 }; myObj.func = fun ...

  3. jquery 更新值。。vue 如何监听?

    size.val(5); // 改变值 //触发 input 事件 ie11 下不能用 size[0].dispatchEvent(new Event('input'));   有些浏览器 不支持.. ...

  4. Helvetic Coding Contest 2016 online mirror C1

    Description One particularly well-known fact about zombies is that they move and think terribly slow ...

  5. centos7虚拟机安装

    Centos7 第1章 CENTOS 7 简介 1.1 centos的演变 启动流程sysvinit 串行启动:一次一个, 一个一个启动 并行启动:全部的一起启动 init优点 运行非常良好.主要依赖 ...

  6. python3+Appium自动化04-Toast元素识别

    什么是toast? 如下图,“再按一次退出程序”,这就是toast 如何定位toast元素? Appium1.6.3开始支持识别Toast内容,主要基于UiAutomator2 想定位toast元素, ...

  7. MapReduce实战:自定义输入格式实现成绩管理

    1. 项目需求 我们取有一份学生五门课程的期末考试成绩数据,现在我们希望统计每个学生的总成绩和平均成绩. 样本数据如下所示,每行数据的数据格式为:学号.姓名.语文成绩.数学成绩.英语成绩.物理成绩.化 ...

  8. 记ubuntu下安装Anaconda

    晚上尝试在ubuntu 16.04版本下安装python的Anaconda3发行版. 从清华源下载的Anaconda3-Linux 64位版本安装包,然后顺利的下一步,下一步.....一切顺利!结果到 ...

  9. Windows下使用nvm管理多个Node.js 版本

    下载 https://github.com/coreybutler/nvm-windows/releases 安装       配置 使用 # nvm install 版本号   # nvm list ...

  10. 16.Ubuntu LTS 16.04安装搜狗输入法全过程记录(纯新手)

    这是我第四次打算转到Ubuntu上了,应该不会像以前那样装个系统就拜拜了.打算先把C和Vim重新学起来,数据结构那本书看完写完,第二步是学python和算法导论,暂定如此. 昨天晚上系统装完以后想着要 ...