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

devtools/2024/12/22 11:12:30/

前言

 

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.ppmy.cn/devtools/104983.html

相关文章

EmguCV学习笔记 VB.Net 6.S 特别示例

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

html+css+js网页设计 菜菜网-移动端 5个页面

htmlcssjs网页设计 菜菜网-移动端 5个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&am…

【数据结构之线性表】

文章目录 一、线性表的基本概念1. 定义2. 特点2.1 元素有序排列2.2 元素类型相同2.3 元素之间存在一对一的关系 二、线性表的实现方式(C)1. 顺序表(数组)1.1 定义1.2 实现示例1.3 优点1.4 缺点 2. 链表2.1 定义2.2 实现示例2.3 优…

centOS安装R语言4.0及以上

centOS安装R语言4.0及以上 源码编译安装R安装配置必要的依赖库安装配置必要图片库检测配置R问题1:R语言安装依赖,缺啥补啥问题2:依赖 curl7 and curl >7.28 检查配置,如果没问题,进行编译安装安装Rstudio-server参考…

java 接口 泛型使用

Java 接口中的泛型使用 在 Java 中,接口是一种抽象类型,用于定义方法的一组规范,而泛型则提供了一种强类型的机制来在类、接口和方法中传递类型参数。这两者结合使用可以提升代码的复用性和类型安全性。本文将探讨 Java 接口中泛型的使用&am…

【C++ Primer Plus习题】8.3

问题: 解答: #include <iostream> #include <string> #include <cctype> using namespace std;void function(string& str) {for (int i 0; i < str.size(); i){str[i]toupper(str[i]);} }int main() {string str;while (true){cout << "…

LeetCode讲解篇之198. 打家劫舍

文章目录 题目描述题解思路题解代码 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统…

讲一下apk瘦身方案

一、优化资源文件 图像资源优化 压缩图片&#xff1a;使用图像压缩工具&#xff0c;如 TinyPNG、ImageOptim 等&#xff0c;在不明显降低图像质量的前提下减小图片文件大小。选择合适的图片格式&#xff1a;对于不需要透明度的图片&#xff0c;可以考虑使用 JPEG 格式代替 PNG …