• EF中创建、使用Oracle数据库的Sequence(序列)功能


    ** 背景 **

    项目中订单号原来的生成规则由日期加随机数组成,后期需求决定将订单号生成规则更改为生成日期加当天当前订单数。

    每天的订单数都是从0开始的,每生成一个订单,订单数就应该加1.订单数应该是持久的,写在Session中或者Memcached缓存中,当网站重启或者服务器重启时都会面临丢失的问题,所以只能存在数据库中。幸好Oracle数据库提供了Sequence(序列)功能,我们来看下Sequence(序列)的概述及其用法。

    ** 概述 **

    Oracle提供了Sequence对象,由系统提供自增长的序列号,通常用于生成数据库的自增长主键或序号的地方。
    Sequence是数据库系统按照一定规则自动增加的数字序列。这个序列一般作为代理主键(因为不会重复),没有其他任何意义。1

    ** 基本用法 **

    CREATE SEQUENCE emp_sequence -序列名
    INCREMENT BY 1 — 每次递增数值
    START WITH 1 — 从1开始计数
    MAXVALUE 999999 --最大值 || NOMAXVALUE — 不设置最大值
    CYCLE - 循环,达到最大值从最小值开始||NOCYCLE — 一直累加,不循环
    CACHE 10;-缓存数值

    下面我们就来看EF的DbContext具体使用:
    ** 1. 判断是否存在名为ODORDER的序列 **

    int count = context.Database.SqlQuery<int>("SELECT count(*) FROM All_Sequences where Sequence_name='ODORDER'").FirstOrDefault()
    

    如数据库中存在该序列,则返回的数值应大于0。
    ** 2. 每天的订单数都应该是从新开始的,所以简单做法如果存在ODORDER该序列,我们先删除. **

    context.Database.ExecuteSqlCommand("DROP SEQUENCE ODORDER")
    

    ** 3. 创建名为ODORDER的序列 **

     context.Database.ExecuteSqlCommand("CREATE SEQUENCE ODORDER INCREMENT BY 1 START WITH 100000 MAXVALUE 900000 MINVALUE 100000 CYCLE CACHE 20 ");
    

    ** 4. 获取最新订单数 **

    context.Database.SqlQuery<int>("select ODORDER.nextval from dual").FirstOrDefault()
    

    原创文章,如有转摘请注明来源!

  • 相关阅读:
    Oracle视图,索引,序列
    Oracle的表创建和事务管理
    Oracle子查询和多表查询
    python实现二叉树
    python实现二分查找
    python实现各种排序算法
    flask邮件发送
    django之图片预览实现方法
    django ORM操作
    Django Form之select自动更新
  • 原文地址:https://www.cnblogs.com/beyond1983/p/5760353.html
Copyright © 2020-2023  润新知