当前位置: 首页 > article >正文

OceanBase V4.2解析:如何用迭代器 Generator快速生成任意数据

前言

 

OceanBase 4.2 版本新增了迭代器 generator 函数。尽管这一功能在数据库领域中已属于通用能力,postgresql 也提供了类似的函数,然而,与MySQL和Oracle数据库在默认情况下是需要用户额外编写函数来实现的。OceanBase 4.2 的这一更新也是满足更多用户的需求。

迭代器具有自我多次运行的能力,通过generator函数,用户可以快速地生成任意所需数据。以下是关于generator函数在OceanBase中的具体应用案例。

随机0至99的字符

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

1703044518

随机生成10到19的随机

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

1703044553

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

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

1703044570

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

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

1703044619

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

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

1703044648

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

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

1703044729

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

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

1703044797

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

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

1703044822

生成时间,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)) ;

1703044847

生成顺序序列

CREATE SEQUENCE seq1 START WITH 1 INCREMENT BY 1;

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

1703044881

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

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

1703044951

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

假设列表选项有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)) ;

1703044977

案例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)) ;

1703044996


http://www.kler.cn/a/290027.html

相关文章:

  • Spark 核心概念与宽窄依赖的详细解析
  • Python数据预处理
  • ODOO学习笔记(3):Odoo和Django的区别是什么?
  • Labelme标注数据的一些操作
  • 【在Linux世界中追寻伟大的One Piece】多路转接epoll
  • LinkedList和单双链表。
  • 【复旦微FM33 MCU 外设开发指南】外设篇3——SPI
  • day02 1.c++对c的扩充
  • 学习关系型数据库:在MAC下编译安装firebird
  • 【iOS】——分类拓展关联对象
  • iOS面试:BAD_ACCESS在什么情况下出现?
  • SQL 语言简明入门:从历史到实践
  • BaseCTF之web(week2)
  • springboot使用swagger生成接口文档
  • 华为 HCIP-Datacom H12-821 题库 (6)
  • Leetcode236经典题目二叉树的最近公共祖先
  • CAD二次开发IFoxCAD框架系列(26)- 分段测量多段线长度和计算多边形的面积
  • CTFHub技能树-备份文件下载-网站源码
  • 一款用于分析java socket连接问题的工具
  • 【蓝桥杯青少组】第十五届省赛python(2024)
  • UE5.3 新学到的一些性能测试合计(曼巴学习笔记)
  • Unet改进10:在不同位置添加CPCA||通道先验卷积注意力机制
  • ARM内存屏障/编译屏障API(__DMB、__DSB、__ISB)用法及举例
  • 基于Spring的Uniapp自动更新实现方法
  • 一篇常见第三方库之以及详细使用示例教程
  • C++第四十五弹---深入理解包装器:提升代码复用性与安全性的利器