OceanBase4.2.1的gernerator功能应用实践

2024年 5月 7日 70.1k 0

前文

OceanBase4.2上线新功能迭代器generator函数,这属于数据库都具备的基本功能,postgresql也有这样的函数,但是Mysql和Oracle默认需要另外写函数支持,可以说OceanBase是与时俱进。迭代器可以自我运行多次,通过generator可以快速生成任意数据。下面是generator的应用实践。

随机0至99的字符

select  floor((RAND())*100)  from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-1

随机生成10到19的随机

select  floor((RAND()+1)*10)  from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-2

随机生成小数据点后2位,前面整数是0

SELECT ROUND(RAND(), 2) from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-3

随机生成小数据点后4位,前面整数是2位

SELECT ROUND(RAND()*100, 4) from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-4

生成1994年1月15日往前的日期时间,
随机增加数据

select date_add('1994-01-15' , interval floor((RAND()+1)*20) day )   from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-5

生成1994年1月15日往前的随机日期时间,
递减数据1  

select date_sub('1994-01-15' , interval floor((RAND())*10) day )   from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-6

生成时间,1994年1月15做基准,随机按月递减

select date_sub('1994-01-15' , interval floor((RAND())*10) month )   from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-7

生成时间,1994年1月15做基准,随机按年递减

select date_sub('1994-01-15' , interval floor((RAND())*10) year )   from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-8

生成时间,1994年1月15做基准,随机按年、月、日 递减

select date_sub(date_sub(date_sub('1994-01-15' , interval floor((RAND())*10) year ),interval floor((RAND())*10) month),interval floor((RAND())*10) day)   from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-9

生成顺序序列

CREATE SEQUENCE seq1 START WITH 1 INCREMENT BY 1;

select seq1.nextval  from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-10

生成长度为100的随机字符串

select  RANDSTR(100, RANDOM()) from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-11

生成定算的随机  固定数组变量

假设列表选项有MAIL、TRUCK、AIR、FOB、REG AIR,只想生成数组变量这些相关的东西。

Postgresql很简单就可以做到,它具备变量数组的表达,例如(array['MAIL', 'TRUCK', 'RAIL', 'FOB', 'SHIP', 'REG AIR'])[列表]。

我找了OceanBase的官方相关文档,目前数组变量固定输出的函数,但是达到同样的目标可以用以下较灵活的方法制造数据

select  

CASE

      WHEN concat("test",floor((RAND())*6)) ='test0' THEN 'MAIL'

      WHEN concat("test",floor((RAND())*6)) ='test1' THEN 'TRUCK'

      WHEN concat("test",floor((RAND())*6)) ='test2' THEN 'AIR'

      WHEN concat("test",floor((RAND())*6)) ='test3' THEN 'RAIL'

      WHEN concat("test",floor((RAND())*6)) ='test4' THEN 'FOB'

      WHEN concat("test",floor((RAND())*6)) ='test5' THEN 'SHIP'

      WHEN concat("test",floor((RAND())*6)) ='test0' THEN 'MAIL'

      WHEN concat("test",floor((RAND())*6)) ='test1' THEN 'TRUCK'

      WHEN concat("test",floor((RAND())*6)) ='test2' THEN 'AIR'

      WHEN concat("test",floor((RAND())*6)) ='test3' THEN 'RAIL'

      WHEN concat("test",floor((RAND())*6)) ='test4' THEN 'FOB'

      WHEN concat("test",floor((RAND())*6)) ='test5' THEN 'SHIP'

ELSE 'REG AIR'

END

from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-12

案例tpc-h基准中的 lineitem表

insert /*+ ENABLE_PARALLEL_DML PARALLEL(4) */ into  lineitem  

select  seq2.nextval,

      floor((RAND()+1)*1000000),

      floor((RAND()+1)*10000),

      floor((RAND()+1)*100),

      floor((RAND()+1)*10000),

      floor((RAND()+1)*1000000),

      floor((RAND()+1)*1000),

      floor((RAND()+1)*1000),

      'F',

      'F',

      date_add('1994-01-15' , interval floor((RAND()+1)*10) day ),

      date_add('1994-09-25' , interval floor((RAND()+1)*7) day ),

      date_add('1995-05-15' , interval floor((RAND()+1)*2) year ),

      RANDSTR(20, RANDOM()),

      CASE

      WHEN concat("test",floor((RAND())*6)) ='test0' THEN 'MAIL'

      WHEN concat("test",floor((RAND())*6)) ='test1' THEN 'TRUCK'

      WHEN concat("test",floor((RAND())*6)) ='test2' THEN 'AIR'

      WHEN concat("test",floor((RAND())*6)) ='test3' THEN 'RAIL'

      WHEN concat("test",floor((RAND())*6)) ='test4' THEN 'FOB'

      WHEN concat("test",floor((RAND())*6)) ='test5' THEN 'SHIP'

      WHEN concat("test",floor((RAND())*6)) ='test0' THEN 'MAIL'

      WHEN concat("test",floor((RAND())*6)) ='test1' THEN 'TRUCK'

      WHEN concat("test",floor((RAND())*6)) ='test2' THEN 'AIR'

      WHEN concat("test",floor((RAND())*6)) ='test3' THEN 'RAIL'

      WHEN concat("test",floor((RAND())*6)) ='test4' THEN 'FOB'

      WHEN concat("test",floor((RAND())*6)) ='test5' THEN 'SHIP'

      ELSE 'REG AIR'

      END as shipmode,

      RANDSTR(25, RANDOM())

from table(generator(10)) ;

OceanBase4.2.1的gernerator功能应用实践-13

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论