bloomberg bulkfile 在oracle的存储

2023-10-19 23:59

本文主要是介绍bloomberg bulkfile 在oracle的存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章导航


  1. bloomberg bulkfile 的分类
  2. 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 YUBLdeclare-- Local variables herev_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 isselect a.table_name,a.field_name,b.oracle_typefrom bb_tables aleft join bb_fields b on a.field_name=b.field_mnemonicwhere not exists(select 1 from user_tables where table_name=a.table_name)order by 1,2;beginfor v_row in sp_cursor loopv_loopup_num :=v_loopup_num+1;v_current_tbname:=v_row.table_name; if v_loopup_num=1 thenv_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 thenv_field_name:='C'||v_row.field_name;end if; if length(v_field_name)>30 thenv_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;exceptionwhen OTHERS thendbms_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

 

转载于:https://www.cnblogs.com/champaign/p/BulkFile_01.html

这篇关于bloomberg bulkfile 在oracle的存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_30389003/article/details/99448190
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/243232

相关文章

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处