Generate a table with number sequence in sql

本文介绍了在 Oracle 数据库中使用 SQL 生成数字序列的方法,包括预定义集合类型、纯 SQL 连接以及通过自定义函数实现动态数字序列生成的技术细节。

Generate a table with number sequence in sql
=========

 

1 Pre-defined collection types in Oracle
---------

select to_number(column_value) as num from
   table(sys.dbms_debug_vc2coll(1,2,3,4,5,6,7,8,9));

select to_number(column_value) as num from
   table(sys.KU$_VCNT(1,2,3,4,5,6,7,8,9));

select column_value as num from
   table(sys.KU$_OBJNUMSET(1,2,3,4,5,6,7,8,9));

 

2 Join: pure sql
---------

select a.i+b.i+c.i+d.i+1 as num
from
   (select 0 i from dual union all select 1 from dual) a,
   (select 0 i from dual union all select 2 from dual) b,
   (select 0 i from dual union all select 4 from dual) c,
   (select 0 i from dual union all select 8 from dual) d
order by num;

 

 

3 How to make number dynamic?
---------
?

 

3.1 Define function with collection type as return value

-----------------

It's not only sql.

And myaybe it's not correct or appropriate for dynamic.

However, I like it.

 

First, define a type:

 

create or replace type T_NUM_TAB as TABLE OF NUMBER;

 

Then, define the function:

 

CREATE OR REPLACE FUNCTION NUM_COLLECT (
       NUM_START IN NUMBER, 
       NUM_END IN NUMBER,
       NUM_STEP IN NUMBER DEFAULT 1)
  RETURN T_NUM_TAB
AS
  l_tab   T_NUM_TAB := T_NUM_TAB();
  l_idx   NUMBER;
BEGIN
  l_idx := NUM_START;
  WHILE l_idx <= NUM_END LOOP
    l_tab.extend;
    l_tab(l_tab.last) := l_idx;
    l_idx := l_idx + NUM_STEP;
  END LOOP;

  RETURN l_tab;
END;

 

Now, use it as follows:

 

SQL> select * from table(num_collect(2,10,2));

COLUMN_VALUE
------------
           2
           4
           6
           8
          10
 

 Is it a good idea to take sql string as parameter for the function?

 

DELIMITER // CREATE PROCEDURE generate_batch_number(OUT batch_num VARCHAR(20)) BEGIN DECLARE current_date DATE; DECLARE current_sequence INT; -- 获取当前日期 SET current_date = CURDATE(); -- 检查当天是否已有记录 SELECT sequence_number INTO current_sequence FROM batch_number_sequence WHERE batch_date = current_date; -- 如果当天没有记录,插入新记录 IF current_sequence IS NULL THEN INSERT INTO batch_number_sequence (batch_date, sequence_number) VALUES (current_date, 1); SET current_sequence = 1; ELSE -- 如果已有记录,更新序号 UPDATE batch_number_sequence SET sequence_number = sequence_number + 1 WHERE batch_date = current_date; SET current_sequence = current_sequence + 1; END IF; -- 生成批次号 SET batch_num = CONCAT(DATE_FORMAT(current_date, '%Y%m%d'), LPAD(current_sequence, 5, '0')); END // DELIMITER ; -- 创建表 CREATE TABLE person ( -- 业务字段 name VARCHAR(50) COMMENT '姓名', age INT COMMENT '年龄', -- 数据更新标识字段 id INT AUTO_INCREMENT COMMENT '非业务主键,自动编号主键', add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '业务表的数据首次创建的时间', cd_operation CHAR(1) DEFAULT 'I' COMMENT '业务表的数据新增时值为“I”,修改时值为“U”,删除时值为“D”', cd_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '业务表的数据发生修改的时间,如果是第一次新增,则与新增时间一致', cd_batch VARCHAR(20) COMMENT '各部门和地市按批次往前置机更新数据,生成批次号,格式为“数据日期+数据序号”', -- 设置主键 PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '该表用于存储人员的基本信息,包含业务字段和数据更新标识字段';
最新发布
12-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值