bloomberg bulkfile 在oracle的存储
文章导航
一 表名和字段名称的命名规则
1.1. 表名以文件名称直接命名,将文件名中的"."用“_"代替。
如《fundamentals_namr_af_history.out》对应表名为:FUNDAMENTALS_NAMR_AF_HISTORY_OUT
1.2. 字段中特殊字段的处理规则
去接去除字段中的"&","%","/" 例外情况:对于最后一个"%" 用"PRE"替换.因为它代表百分比的含义,bb文件中会同时有xxx和xxx_%这样的field它们是不同的字段。
将"-" 替换为"_"
1.3. 以数字开头字段的字段处理规则
在字段前面加上”H_"
1.4.将连续的"_"只保留一个,且去除开头和结尾的"_"
如 "__ab__cd_" 替换为:"ab_cd"
1.5.长度截取,前24位+后6位
当表名或字段名称处理后长度仍超出30(oracle的最大限制).按规则截取:前面取24位,后面取6位。
如表名:FUNDAMENT ALS_NAMR_AF_HISTORY_OUT 截取后的表名为:FUNDAMENTALS_NAMR_AF_HISRY_OUT
二 创建表结构
2.1. 导入bulkfile文件解析字段
根据bloomberg 下载的文件中 START-OF-FIELDS END-OF-FIELDS 之间的部分即为表的列名,将文件名按命名规则存储为表名。解析出来的表名和字段及字段顺序最终会存在BB_TABLES中的BB_table_name,bb_field_name,field_order中
CREATE TABLE BB_TABLES(
TABLE_NAME varchar2(200), --表名(oracle)
FIELD_NAME varchar2(200), --字段名(oracle)
BB_field_Name varchar2(200), --bloomberg的字段名称
BB_table_name varchar2(200), --bloomberg的表名(对应名称的名称. .xxx替换为_xxx)
FIELD_ORDER number(4) --字段的排序(要与文件中的顺序相同)
)
将解析出来的数据先临时导入到BB_TABLES 的bb_table_name及bb_field_name中
2.2 导入《Harvest Bulk File Field Layout.xlsx》中的字段信息
2.2.1 导入sheet:5115-part I
sheet 内容如下:
将所有的.cax文件对应的表名,与"Bloomberg Field"列的值做笛卡尔积,导入BB_TABLES 的bb_table_name、bb_field_name .字段的顺序导入到 field_order。
导入时将"Bloomberg Field"列空格替换为"_".去掉"<" 、 ">"
2.2.2 导入sheet:5115-part II
sheet 部分内容截图如下:
将所有的_CAX 结尾的表与”Action Mnemonic“和” FieldMnemonic“ 做笛卡尔积、拼接成新的表及field。
如表xxx_cax 与 ACQUIS 拼接成:
Action Mnemonic 做为bb_table_name,FieldMnemonic 做为bb_field_name .字段的顺序做为field_order 导入到BB_TABLES中。
2.2.根据bb_table_name、bb_field_name生成table_name、field_name
update bb_tables set table_name = BB_table_name;
update bb_tables set table_name = replace(table_name,'%','') where instr(table_name,'%')>0;
update bb_tables set table_name = replace(table_name,'/','') where instr(table_name,'/')>0;
update bb_tables set table_name = replace(table_name,'&','') where instr(table_name,'&')>0;
update bb_tables set table_name = replace(table_name,'-','__')where instr(table_name,'-')>0;
update bb_tables set table_name = replace(table_name,'.','_') where instr(table_name,'.')>0;
update bb_tables set table_name = replace(table_name,'__','_') where instr(table_name,'__')>0; --执行2次,多点没关系
update bb_tables set table_name = substr(table_name,2) where substr(table_name,1,1)='_'; --去掉开头的下划线
update bb_tables set table_name = substr(table_name,1,length(table_name)-1) where substr(table_name,-1)='_'; --去掉结尾的下划线
update bb_tables set table_name ='H_'||table_name where regexp_instr(table_name,'[0-9]')=1; --以数字开头的前面加上"H_"
update bb_tables set table_name = substr(table_name,1,24)||substr(table_name,-6) where length(table_name)>30; select distinct table_name,bb_table_name from bb_tables where table_name<>bb_table_name; --检查一下是否修改正确 update bb_tables set field_name = BB_field_name;
update bb_tables set field_name = substr(field_name,1,length(field_name)-1)||'PRE' where substr(field_name,-1,1)='%'; --最后一个%用pre代替。
update bb_tables set field_name = 'PRE'||substr(field_name,2) where substr(field_name,1,1)='%'; --第一个%用pre代替。
update bb_tables set field_name = replace(field_name,'%','') where instr(field_name,'%')>0;
update bb_tables set field_name = replace(field_name,'#','') where instr(field_name,'#')>0;
update bb_tables set field_name = replace(field_name,'/','') where instr(field_name,'/')>0;
update bb_tables set field_name = replace(field_name,'&','') where instr(field_name,'&')>0;
update bb_tables set field_name = replace(field_name,'-','__')where instr(field_name,'-')>0;
update bb_tables set field_name = replace(field_name,'__','_') where instr(field_name,'__')>0; --执行2次,多点没关系
update bb_tables set field_name = substr(field_name,2) where substr(field_name,1,1)='_'; --去掉开头的下划线
update bb_tables set field_name = substr(field_name,1,length(field_name)-1) where substr(field_name,-1)='_'; --去掉结尾的下划线
update bb_tables set field_name ='H_'||field_name where regexp_instr(field_name,'[0-9]')=1; --以数字开头的前面加上"H_"
update bb_tables set field_name = substr(field_name,1,24)||substr(field_name,-6) where length(field_name)>30;
select distinct field_name,BB_field_name from bb_tables where field_name<>BB_field_name; --检查一下是否修改正确
2.3 手工修改一下会重复的表名
--检查重复的表名
select distinct bb_table_name,table_name from bb_tables
where table_name in (
select table_name from bb_tables
group by table_name
having count(distinct bb_table_name)>1
)
order by 2;
update bb_tables set table_name='FUNDAMENTALS_ASIA2_BSPIT_OUT' where bb_table_name='FUNDAMENTALS_ASIA2_BS_PIT_OUT';
update bb_tables set table_name='FUNDAMENTALS_ASIA2_SARD_OUT2' where bb_table_name='FUNDAMENTALS_ASIA2_SARD_CF_PIT_OUT';
update bb_tables set table_name='FUNDAMENTALS_ASIA2_SBP_OUT' where bb_table_name='FUNDAMENTALS_ASIA2_SARD_BS_PIT_OUT';
update bb_tables set table_name='FUNDAMENTALS_NAMR_SBHP_OUT' where bb_table_name='FUNDAMENTALS_NAMR_SARD_BS_HISTORY_PIT_OUT';
update bb_tables set table_name='FUNDAMENTALS_NAMR_SCHP_OUT' where bb_table_name='FUNDAMENTALS_NAMR_SARD_CF_HISTORY_PIT_OUT';
update bb_tables set table_name='FUNDAMENTALS_NAMR_SIHP_OUT' where bb_table_name='FUNDAMENTALS_NAMR_SARD_IS_HISTORY_PIT_OUT';
update bb_tables set table_name='EQUITYASIA1_CAX_EQYOFFER' where bb_table_name='EQUITYASIA1CORPORATEACTIONSV2_CAX.EQY_OFFER';
update bb_tables set table_name='EQUITYASIA2_CAX_EQYOFFER' where bb_table_name='EQUITYASIA2CORPORATEACTIONSV2_CAX.EQY_OFFER';
update bb_tables set table_name='EQUITYEURO2_CAX_EQYOFFER' where bb_table_name='EQUITYEUROCORPORATEACTIONSV2_CAX.EQY_OFFER';
update bb_tables set table_name='EQUITYLAMR2_CAX_EQYOFFER' where bb_table_name='EQUITYLAMRCORPORATEACTIONSV2_CAX.EQY_OFFER';
update bb_tables set table_name='EQUITYNAMR2_CAX_EQYOFFER' where bb_table_name='EQUITYNAMRCORPORATEACTIONSV2_CAX.EQY_OFFER';
update bb_tables set table_name='FUNDAMENTALS_ASIA1_SCP_OUT' where bb_table_name='FUNDAMENTALS_ASIA1_SARD_CF_PIT_OUT';
update bb_tables set table_name='FUNDAMENTALS_ASIA2_IHP_OUT' where bb_table_name='FUNDAMENTALS_ASIA2_IND1_HISTORY_PIT_OUT';
update bb_tables set table_name='FUNDAMENTALS_ASIA2_SBH_OUT' where bb_table_name='FUNDAMENTALS_ASIA2_SARD_BS_HISTORY_OUT';
update bb_tables set table_name='FUNDAMENTALS_ASIA2_SCH_OUT' where bb_table_name='FUNDAMENTALS_ASIA2_SARD_CF_HISTORY_OUT';
三. 字段类型导入
3.1 将bloomberg提供的《fields.csv》中的内容导入到oracke中。
表名为bb_fields,额外增加三个列:
oracle_type varchar2(50), --对应到oracle中的类型
oracle_field_name varchar2(50), --对应到oracle的字段名称
bb_type_src varchar2(100) --这些字段的导入源
其中 bb_type_src='fields.csv'
3.2 将bloomberg提供的《Harvest Bulk File Field Layout.xlsx》中的内容导入到bb_fields中
仅需要导入 《5115-part I》《5115-part 2》两个sheet中的内容.导入后需要过滤一下同名的field
3.3 构建bb_types对应到oracle中的字段名称和字段类型
根据 bb_fields中的 filed_type、standard_width、standard_decimal_places 来构造出oracle_type.
update bb_fields set oracle_type='Real' where bb_type_src='fields.csv' and field_type='Real';
update bb_fields set oracle_type='number(30,6)' where bb_type_src='fields.csv' and field_type='Price';
update bb_fields set oracle_type='varchar2(20)' where bb_type_src='fields.csv' and field_type='Time';
update bb_fields set oracle_type='varchar2(30)' where bb_type_src='fields.csv' and field_type='Month/Year';
update bb_fields set oracle_type='CLOB' where bb_type_src='fields.csv' and field_type='Bulk Format';
update bb_fields set oracle_type='CLOB' where bb_type_src='fields.csv' and field_type='Long Character';
update bb_fields set oracle_type='number(4)' where bb_type_src='fields.csv' and field_type='Boolean';
update bb_fields set oracle_type='number(10)' where bb_type_src='fields.csv' and field_type='Integer';
update bb_fields set oracle_type='DATE' where bb_type_src='fields.csv' and field_type='Date';
update bb_fields set oracle_type=(case when CURRENT_MAXIMUM_WIDTH>2000 then 'CLOB' else 'VARCHAR2('||CURRENT_MAXIMUM_WIDTH||')' end) where bb_type_src='fields.csv' and field_type='Character';
update bb_fields set oracle_type='varchar2(30)' where bb_type_src='fields.csv' and field_type='Date or Time';
update bb_fields set oracle_type='rela' where bb_type_src='fields.csv' and field_type='Integer/Real';
然后再根据命名规则,生成oracle_field_name
update bb_fields set oracle_field_name = field_mnemonic
update bb_fields set oracle_field_name = substr(oracle_field_name,1,length(oracle_field_name)-1)||'PRE' where substr(oracle_field_name,-1,1)='%'; --最后一个%用pre代替。
update bb_fields set oracle_field_name = replace(oracle_field_name,'%','') where instr(oracle_field_name,'%')>0;
update bb_fields set oracle_field_name = replace(oracle_field_name,'/','') where instr(oracle_field_name,'/')>0;
update bb_fields set oracle_field_name = replace(oracle_field_name,'&','') where instr(oracle_field_name,'&')>0;
update bb_fields set oracle_field_name = replace(oracle_field_name,'-','_') where instr(oracle_field_name,'-')>0;
update bb_fields set oracle_field_name = replace(oracle_field_name,'__','_') where instr(oracle_field_name,'__')>0;
update bb_fields set oracle_field_name = substr(oracle_field_name,2) where substr(oracle_field_name,1,1)='_';
update bb_fields set oracle_field_name = substr(oracle_field_name,1,length(oracle_field_name)-1) where substr(oracle_field_name,-1)='_';
update bb_fields set oracle_field_name ='H_'||oracle_field_name where regexp_instr(oracle_field_name,'[0-9]')=1; --以数字开头的前面加上"H_"
update bb_fields set oracle_field_name = substr(oracle_field_name,1,24)||substr(oracle_field_name,-6) where length(oracle_field_name)>30; select oracle_field_name,field_mnemonic from bb_fields where oracle_field_name<>field_mnemonic;
3.4 检查一下是否有字段无法找到对应的类型
select distinct bb_field_name,field_name from bb_tables t
where not exists(select 1 from bb_fields s where t.bb_field_name=s.bb_field_name);
匹配不上反馈给bloomberg处理。我这里临时把匹配不上的统一改为类型varchar2(1999)
3.5 建表
-- Created on 2019/5/22 by YUBL declare
-- Local variables here
v_sql_cmd clob:='';
v_current_tbname varchar2(30):='';
v_pre_tbname varchar2(30):='';
v_loopup_num number(10):=0;
v_field_name varchar2(100);
cursor sp_cursor is
select a.table_name,a.field_name,b.oracle_type
from bb_tables a
left join bb_fields b on a.field_name=b.field_mnemonic
where not exists(select 1 from user_tables where table_name=a.table_name)
order by 1,2; begin for v_row in sp_cursor loop
v_loopup_num :=v_loopup_num+1;
v_current_tbname:=v_row.table_name;
if v_loopup_num=1 then
v_sql_cmd:='create table '||v_current_tbname||'(';
end if; v_field_name:=v_row.field_name;
if regexp_instr(v_row.field_name,'[0-9]')=1 then
v_field_name:='C'||v_row.field_name;
end if; if length(v_field_name)>30 then
v_field_name:=substr(v_field_name,1,24)||substr(v_field_name,-6);
end if; if v_current_tbname<>v_pre_tbname then
v_sql_cmd:=v_sql_cmd||'HCREATETIME DATE DEFAULT SYSDATE,HUPDATETIME DATE)';
BEGIN
execute immediate v_sql_cmd;
exception
when OTHERS then
dbms_output.put_line(v_sql_cmd);
END; v_sql_cmd:='create table '||v_current_tbname||'(';
end if; v_sql_cmd:= v_sql_cmd||' '||v_field_name||' '||nvl(v_row.oracle_type,'varchar2(1999)')||',';
v_pre_tbname:=v_current_tbname; end loop;
end;
如果output中有打印出建表语句,把这些复制出来检查为什么无法创建。
四 主键信息导入
4.1 新建表:bb_table_key_columns 用于存储每个表的主键信息
CREATE TABLE BB_TABLE_KEY_COLUMNS
(
BB_TABLE_NAME VARCHAR2(100),
BB_KEY_COLUMN VARCHAR2(100),
TABLE_NAME VARCHAR2(100),
KEY_COLUMN VARCHAR2(100)
)
4.2 将《Harvest Bulk File List.xlsx》sheet:File List的内容导入,部分内容截图如下:
将file_name、primary key 分别导入到bb_table_name、bb_key_column中。parimary key 要按“|”分隔后导入。
注意:
文件中有些主键的信息是错误 的。比如:idbbcompany 要改成:ID_BB_COMPANY
bloomberg bulkfile 在oracle的存储的更多相关文章
- bloomberg bulkFile解析
文章导航 bloomberg bulkfile解析 bloomberg bulkfile 在oracle的存储 准备工作: Bloomberg 提供了以下文件 1 . fields.csv 下载地址: ...
- bloomberg bulkfile【一】 文件的分类
文章导航 bloomberg bulkfile [一] 文件的分类 bloomberg bulkfile [二] 文件解析 bloomberg bulkfile [三] 在oracle的存储 订 ...
- oracle rac存储安装
oracle rac 10.2 的在 linux 上的存储选项 博客分类: Oracle OracleLinux项目管理配置管理 Oracle 集群需要存储的软件和数据 项目 内容 最少磁盘空间 C ...
- ORACLE数据库存储结构简介(转)
首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内部的组织和管理数据的方式. 物理存储结构:o ...
- Oracle 数存储——物理结构
Oracle存储——逻辑结构 Oracle 数据库存储物理结构 物理存储结构是实际的数据存储单元,对应于操作系统文件. oracle数据库就是由驻留在服务器的磁盘上的这些操作系统文件组成的. 物理存储 ...
- Oracle 逻辑存储结构
一.总述 逻辑存储结构是 Oracle 数据库存储结构的核心内容,对 Oracle 数据库的所有操作都会涉及逻辑存储结构.逻辑存储结构是从逻辑的角度分析数据库的组成,是对数据存储结构在逻辑概念上的划分 ...
- ORACLE数据库存储结构
一.数据块 Oracle对数据库数据文件中的存储空间进行管理的单位是数据块.数据块是数据库中最小的(逻辑)数据单位,是最小的I/O单位.与数据块对应的,所有数据在操作系统级的最小物理存储单位是字节.每 ...
- Oracle DB 存储增强
• 设置Automatic Storage Management (ASM) 快速镜像 再同步 • 使用ASM 首选镜像读取 • 了解可伸缩性和性能增强 • 设置ASM 磁盘组属性 • 使用SYSA ...
- oracle的存储结构
表空间 当一个用户被创建以后,随之就要为用户分配数据存储的空间,这在oracle中成为“表空间”(Tablespace). 在数据库中创建用户时,基于应用性能和管理的考虑,最好为不同的用户创建独立的表 ...
随机推荐
- golang web框架 beego 学习 (六) request body和module的映射
router.go package routers import ( "gowebProject/controllers" "github.com/astaxie/bee ...
- 最新 找钢网java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.找钢网等10家互联网公司的校招Offer,因为某些自身原因最终选择了找钢网.6.7月主要是做系统复习.项目复盘.LeetCo ...
- JDK替换掉系统自带的gij编译工具
解决办法: 在终端里面依次输入以下两句话 alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_11/bin/java 300 al ...
- logback的xml配置文件模板(超详细)
<?xml version="1.0" encoding="UTF-8" ?> <!-- 在此未说明属性为非必须的,那就表示属性必须设置 -- ...
- windows和linux环境下使用google的glog日志库
一.概述 glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5. githut地址:https://github.com/googl ...
- laravle6.0-IOC-DI浅谈
1.什么是IOC,DI IOC(Inversion of Control)控制反转:ioc意味着,你将自己设计好的对象交给容器来控制,而不是传统的在你的对象内部直接控制.比如: 人 操控 手机 做一些 ...
- python并发编程之IO模型(实践篇)
一.阻塞IO 介绍略(请看概念篇) 二.非阻塞IO 在非阻塞式IO中,用户进程需要不断的主动询问kernel数据准备好了没有 # 服务端 import socket import time serve ...
- Python 【模块】
A 什么是模块 最高级别的程序组织单元(模块什么都能封装) 模块中,我们不但可以直接存放变量,还能存放函数,还能存放类 定义变量需要用赋值语句,封装函数需要用def语句,封装类需要用class语句,但 ...
- pandas数据结构之Series笔记
对Series的理解也源于对其相关的代码操作,本次仅贴一些代码来加深理解以及记忆 import pandas as pd import numpy as np s = pd.Series(np.ran ...
- Redis的AOF重写脚本
手动触发 每天定期的去执行一次 写了一个脚本 bgrewriteaof.sh 内容如下: #!/bin/bash /usr/local/redis/redis-cli -p 6379 -h 127.0 ...