oracle 流水号 (日期)

博主分享了在Oracle中自动生成日期流水号的经验,对比了Oracle与MSSQL的使用感受,寻求更好的实现方法。

在网上找了一下,没有,那就自己写一个了,刚换一公司,刚学习oracle,请大家见笑.可能用MSSQL多了,从编程来说感觉还没有MSSQL方便.用MSSQL下面就是一个函数.如果大家有好的方法,清说说:


-- 添加sequence  drop sequence EXAMPLE_SEQ
create  sequence EXAMPLE_SEQ
increment 
by   1
start 
with   0
minvalue 
0
maxvalue 
9999
cache 
20 ;
-- 添加表
create   TABLE  TEST(id  VARCHAR2 ( 20 ),no  VARCHAR2 ( 10 ),E_ON  VARCHAR2 ( 20 ))

-- 在TEST表上创建一个触发器
CREATE   OR   REPLACE   TRIGGER  TRI_EXAMPLE_TABLE BEFORE  INSERT   ON  TEST  FOR  EACH ROW
beg
Oracle 数据库中设计和使用流水号,通常涉及到序列(Sequence)和表(Table)的结合使用。流水号常用于生成具有特定格式的唯一编号,例如订单编号、发票编号等。以下是一个完整的设计和实现方法: ### 1. 使用 Sequence 生成唯一数字 Oracle 提供了 `SEQUENCE` 对象,用于生成唯一的数字序列。可以使用如下语句创建一个序列[^1]: ```sql CREATE SEQUENCE order_seq START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; ``` - `START WITH 1` 表示从 1 开始生成。 - `INCREMENT BY 1` 表示每次递增 1。 - `NOCACHE` 表示不缓存序列值,确保生成的序列没有跳跃,适用于高并发环境。 - `NOCYCLE` 表示当序列达到最大值时不会循环。 ### 2. 定义存储流水号的表 为了存储流水号信息,可以创建一个表来管理编号规则。例如: ```sql CREATE TABLE serial_number_config ( id NUMBER PRIMARY KEY, prefix VARCHAR2(20), -- 前缀 current_number NUMBER, -- 当前流水号 suffix_length NUMBER -- 流水号长度 ); ``` - `prefix` 用于存储固定前缀,例如 `ORD-` 表示订单。 - `current_number` 用于记录当前的流水号。 - `suffix_length` 用于定义流水号的长度,例如 5 表示生成 `00001` 格式。 ### 3. 实现流水号生成逻辑 在 PL/SQL 中编写一个函数,用于生成符合规则的流水号。例如: ```sql CREATE OR REPLACE FUNCTION generate_serial(p_prefix VARCHAR2) RETURN VARCHAR2 IS v_current_number NUMBER; v_suffix_length NUMBER := 5; v_serial VARCHAR2(30); BEGIN -- 获取当前流水号 SELECT current_number INTO v_current_number FROM serial_number_config WHERE prefix = p_prefix FOR UPDATE; -- 加锁防止并发问题 -- 更新流水号 UPDATE serial_number_config SET current_number = current_number + 1 WHERE prefix = p_prefix; -- 构建流水号 v_serial := p_prefix || LPAD(v_current_number, v_suffix_length, '0'); RETURN v_serial; END; ``` - `FOR UPDATE` 用于防止并发操作导致流水号重复。 - `LPAD` 函数用于填充前导零,确保流水号长度一致。 ### 4. 调用函数生成流水号 在插入数据时调用该函数,例如: ```sql INSERT INTO orders (order_id, customer_name) VALUES (generate_serial('ORD-'), 'John Doe'); ``` 这样,每次插入新订单时都会生成唯一的订单编号,例如 `ORD-00001`、`ORD-00002` 等。 ### 5. 优化与扩展 - **并发控制**:在高并发场景下,可以考虑使用 `SELECT FOR UPDATE NOWAIT` 避免长时间等待。 - **性能优化**:如果对性能要求较高,可以缓存多个流水号一次性分配,减少数据库访问频率。 - **多规则支持**:可以在 `serial_number_config` 表中定义更多规则,例如按日期重置流水号。 ###
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值