当前位置: 首页 > 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/news/290027.html

相关文章:

  • 【复旦微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++第四十五弹---深入理解包装器:提升代码复用性与安全性的利器
  • 浙大数据结构:01-复杂度3 二分查找
  • 一文读懂期权交易规则和操作方法分享
  • gitk无法打开
  • Python将两个Excel文件按相同字段合并到一起
  • gcc编译与Linux下的库
  • k8s dial tcp 10.97.0.1:443: i/o timeout
  • 帮招一名3C大佬机器视觉工程师,工作地:苏州,月薪25K-30K,30岁以下,Halcon独立开发,单休,有管理经验更佳有绩效奖
  • 飞利浦开放式耳机怎么样?飞利浦、西圣、漫步者爆火机型大对决!
  • SprinBoot+Vue宠物领养救助微信小程序的设计与实现
  • 解决firewalld启动状态下docker无法启动