博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 自动生成hive建表语句
阅读量:6677 次
发布时间:2019-06-25

本文共 6284 字,大约阅读时间需要 20 分钟。

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

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

1 create table T_P_TABLE_NAME_TEMP2 (3   owner        VARCHAR2(30) not null,4   table_name   VARCHAR2(30) not null,5   tab_comments VARCHAR2(4000),6   column_name  VARCHAR2(30) not null,7   data_type    VARCHAR2(106),8   col_comments VARCHAR2(4000)9 );

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

1 -- Create table 2 create table T_SQL 3 ( 4   scsj       DATE, 5   sqlyj      VARCHAR2(4000), 6   table_name VARCHAR2(100) not null, 7   mxyj       VARCHAR2(4000) 8 ) 9 -- Add comments to the columns 10 comment on column T_SQL.scsj11   is '生成时间';12 comment on column T_SQL.sqlyj13   is 'SQL语句';14 comment on column T_SQL.table_name15   is '表名';

③ 存储过程代码。

1 create or replace procedure p_ddpt_sql_init(p_table_name varchar2, --输入表名,必须大写  2                                            p_error_no   out int, --错误编号  3                                            p_error_info out varchar2  --错误信息  4                                            )  5   6 --调度平台 建表语句生成  7   8  as  9   nb_begindate date; 10   nb_enddate   date; 11   v_count      number; 12    13   v_update_sql varchar(2000); 14   v_temp_sql varchar(2000); 15   v_detail_sql varchar(2000); 16   v_out_sql varchar(2000); 17    18   v_owner varchar(2000); 19   v_table_name varchar(2000); 20   v_tab_comments varchar(2000); 21   v_column_name varchar(2000); 22   v_data_type varchar(2000); 23   v_col_comments varchar(2000); 24 begin 25  26   p_error_no   := 0; 27   p_error_info := ''; 28  29   nb_begindate := sysdate; 30    31   v_out_sql := 'use dm_mms;'||chr(13)|| 32                'drop table '||p_table_name||';'||chr(13)|| 33                'create table '||p_table_name||'('||chr(13); 34                  35   execute immediate 'truncate table t_p_table_name_temp'; 36    37   insert into t_p_table_name_temp 38     (owner, table_name, tab_comments, column_name, data_type, col_comments) 39     select a.owner, 40            a.table_name, 41            c.comments tab_comments, 42            a.column_name, 43            a.data_type, 44            b.comments col_comments 45       from all_tab_columns a, all_col_comments b, all_tab_comments c 46      where a.table_name = b.table_name 47        and a.owner = b.owner 48        and a.column_name = b.column_name 49        and a.table_name = c.table_name 50        and a.owner = c.owner 51        and c.table_type = 'TABLE' 52        and a.table_name = p_table_name 53      order by a.table_name; 54    commit; 55     56    update t_p_table_name_temp set data_type = 'string' where data_type = 'VARCHAR2'; 57    update t_p_table_name_temp set data_type = 'double' where data_type = 'NUMBER'; 58    commit; 59     60    update t_p_table_name_temp set data_type = 'string' where column_name = 'YGBH'; 61    update t_p_table_name_temp set data_type = 'string' where column_name = 'DWBH'; 62    update t_p_table_name_temp set data_type = 'string' where column_name = 'FGS'; 63    update t_p_table_name_temp set data_type = 'string' where column_name = 'KHYF'; 64    update t_p_table_name_temp set data_type = 'string' where column_name = 'SFYL'; 65    update t_p_table_name_temp set data_type = 'string' where column_name = 'RSSJ'; 66    update t_p_table_name_temp set data_type = 'string' where column_name = 'YLSC'; 67    update t_p_table_name_temp set data_type = 'string' where column_name = 'YGZT'; 68    update t_p_table_name_temp set data_type = 'string' where column_name = 'SYYLYF'; 69    update t_p_table_name_temp set data_type = 'string' where column_name = 'YGLX'; 70    update t_p_table_name_temp set data_type = 'string' where column_name = 'KHBH'; 71    update t_p_table_name_temp set data_type = 'string' where column_name = 'CSMRZ'; 72    update t_p_table_name_temp set data_type = 'string' where column_name = 'CSLX'; 73    update t_p_table_name_temp set data_type = 'string' where column_name like  '%YF'; 74    update t_p_table_name_temp set data_type = 'string' where column_name like  '%RQ'; 75    update t_p_table_name_temp set data_type = 'string' where column_name like  '%BH';   76    commit; 77     78    --v_update_sql := 'update'|| p_table_name || ' set yj=replace(yj,''chr(13)'',chr(13)) where table_name = '''||p_table_name ||''''; 79    dbms_output.put_line(v_update_sql); 80     81    for c_row in (SELECT * FROM t_p_table_name_temp) 82    loop 83  84       v_owner := c_row.owner; 85       v_table_name := c_row.table_name; 86       v_tab_comments := c_row.tab_comments; 87       v_column_name := c_row.column_name; 88       v_data_type := c_row.data_type; 89       v_col_comments := c_row.col_comments; 90        91       if v_temp_sql is null then  92          v_temp_sql := v_column_name ||' '||v_data_type || ' comment '||'"'||v_col_comments||'"'; 93          v_detail_sql := v_column_name; 94       else  95          v_temp_sql := v_temp_sql ||','||chr(13) || v_column_name ||' '||v_data_type || ' comment '||'"'||v_col_comments||'"'; 96          v_detail_sql := v_detail_sql||',' || chr(13) || v_column_name; 97       end if; 98        99   end loop;100   101   --select distinct tab_comments into v_tab_comments from t_p_table_name_temp;102   103   v_out_sql := v_out_sql || v_temp_sql ||') '||chr(13) ||'comment '||'"'|| v_tab_comments||'"'||chr(13);104   v_detail_sql := 'select ' || chr(13) || v_detail_sql || ' from '|| v_owner ||'.' ||v_table_name;105   106   v_out_sql:=v_out_sql||'partitioned by(busi_date string) '||';';107   108   109   110   nb_enddate := sysdate;111   112   delete t_sql where table_name = p_table_name;113   insert into t_sql114     (scsj, sqlyj, table_name, mxyj)115   values116     (nb_enddate, v_out_sql, p_table_name, v_detail_sql);117   commit; 118   119   p_error_no   := 1;120   p_error_info := '调度平台建表语句生成成功!';121   --p_insert_log_info('', nb_begindate, nb_enddate, '调度平台SQL语句生成', 'p_ddpt_sql_init', p_error_no, p_error_info);122 exception123   when others then124     p_error_no   := -1;125     p_error_info := '调度平台建表语句生成失败!' || sqlerrm;126     --p_insert_log_info('', nb_begindate, nb_enddate, '奖励38 调度平台SQL语句生成', 'p_ddpt_sql_init', p_error_no, p_error_info);127     rollback;128 end p_ddpt_sql_init;

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

 

转载于:https://www.cnblogs.com/wangrui1587165/p/9287099.html

你可能感兴趣的文章
【hoj】2651 pie 二分查找
查看>>
真正的干货是什么?
查看>>
LR函数基础(二)
查看>>
SharedPreference.Editor的apply和commit方法异同
查看>>
【Xamarin开发 Android 系列 6】 Android 结构基础(上)
查看>>
学习一样新东西行而有效的方法 学习捷径 一项由10个步骤组成的学习方法
查看>>
Spotlight实时监控Windows Server 2008
查看>>
linux shell “(())” 双括号运算符使用
查看>>
http://code.662p.com/view/5141.html
查看>>
C C++ OC指针常量和常量指针区别
查看>>
mysql函数大全
查看>>
tomcat内存溢出设置JAVA_OPTS
查看>>
[CareerCup] 12.5 Test a Pen 测试一支笔
查看>>
Maven支撑下的War应用依赖另外一个WAR应用的解决方案
查看>>
JavaScrip——练习(做悬浮框)
查看>>
从游戏开发到应用开发的转变
查看>>
UIApearance
查看>>
android: LayoutInflater使用
查看>>
phalcon的url大小写的问题
查看>>
Tair ldb(leveldb存储引擎)实现介绍
查看>>