oracle 一种从按照某个字段排序获取连续的区间值得存储过程写法

CREATE OR REPLACE PROCEDURE Campaignprize_range( CampaignIdd NUMBER,PrizeTypeIdd NUMBER,ServerIndex VARCHAR2, RETVAL OUT VARCHAR2) IS

  hashcoded VARCHAR2(8);
   prizetypenum number(6);
   prizetypenumold number(6);
   prizetypenumc VARCHAR2(6);
   datacount number(6);
   totalcount number(6);
   flag number(1);
   single number(6);
BEGIN
  flag:=0;
  RETVAL :=‘‘;
  single:=0;
  SELECT count(1) into totalcount FROM mkt_campaignprize a WHERE a.campaignid=CampaignIdd AND a.issend=0 and a.prizetypeid=PrizeTypeIdd  and a.hashcode like ‘‘||ServerIndex||‘%‘  order by a.campaignprizeid asc; 

DECLARE CURSOR c1 IS
      SELECT a.hashcode,a.campaignprizeid  FROM mkt_campaignprize a WHERE a.campaignid=CampaignIdd AND a.issend=0 and a.prizetypeid=PrizeTypeIdd  and a.hashcode like ‘‘||ServerIndex||‘%‘  order by a.campaignprizeid asc;
  BEGIN
      FOR r1 IN c1 LOOP
         prizetypenumold:= to_number( substr(r1.hashcode,3,6));
         single:=single+1;
         if flag=0 then
          RETVAL :=RETVAL||prizetypenumold;
           if totalcount=single then
             RETVAL :=RETVAL||‘,‘||prizetypenumold||‘$‘;
             end if;
          flag:=1;
          if totalcount=1 then
             RETVAL :=RETVAL||‘,‘||prizetypenumold||‘$‘;
             end if;
          else
             prizetypenum:=prizetypenumold+1;
             prizetypenumc:=lpad(prizetypenum,6,‘0‘);
             hashcoded:=ServerIndex||prizetypenumc;
             select  count(1) into datacount  from mkt_campaignprize a WHERE a.campaignid=CampaignIdd AND a.issend=0 and a.prizetypeid=PrizeTypeIdd  and a.hashcode=hashcoded;
             if datacount<1 or single=totalcount  then
                RETVAL :=RETVAL||‘,‘||prizetypenumold||‘$‘;
                flag:=0;
                end if;
          end if;

      END LOOP;

  END;
  Exception
     When others then
       RETVAL :=‘E‘||SUBSTR(SQLERRM, 1, 600);
END Campaignprize_range;

简要介绍下场景:传入的参数CampaignIdd 为活动ID,PrizeTypeIdd为奖品ID,ServerIndex为服务器编号,这里的表mkt_campaignprize是一个给活动配置的奖品表,而这里此存储过程的目的是查询hashcode 字段,该自动在插入的时候就做了处理 :是根据CampaignId,PrizeTypeId,ServerIndex查询出来的值递增顺序存储的,但是也有个别情况,比如删除等操作,使这里的hashcode值有空缺,使这里的值变成了多个区间,而上面的存储过程就是利用游标的形式取的各个区间起始末尾值,而取此区间的值得目的就是系统将此区间值存入缓存中,这样在大数据量礼品的时候可以只存各区间的起始末尾值就可以,系统在实际发奖的时候并不需要都来数据库该表中查询可用的奖品,因为这样在高并发的时候回导致资源的冲突,事务提交的对等问题,产生这样的问题就是因为用户在查询到可用的奖品后拿走后还要去改对应拿走奖品记录的状态,如果同时多人查询出同一个奖品都去更新一条记录的时候就出现冲突,而现在的方式,将奖品的取值的区间存入系统全局缓存,利用线程同步锁的方式,让用户再高并发访问的时候排队在缓存中取对应奖品的记录的hashcode,同时移除到以拿到的奖品,后者来到就不会再拿到,因为缓存是内存,而且只是在其中执行了简单的拿区间值得算法因此访问速度快,大家排队时间极短,大家分别拿到自己制定数据奖品的hashcode后再去数据库查对应的记录 更新对应的记录就不会有资源冲突。

时间: 2024-10-12 12:34:20

oracle 一种从按照某个字段排序获取连续的区间值得存储过程写法的相关文章

mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结

mysql.sqlserver.oracle三种数据库维护索引.外键.字段语法总结 1.     MYSQL数据库 1)    创建索引 CREATE INDEX index_name ON table_name(column_list) CREATE UNIQUE INDEX index_name ON table_name(column_list) 修改表的方式添加索引 ALTER TABLE table_name ADD INDEX index_name(column_list) ALTE

【Oracle】【29】根据字段的长度排序

正文: select * from student s order by nvl(length(trim(s.sname)),0) asc -- nvl(attribute, default value) 当属性值为空时就将其值设默认值 -- length(attrbute) 得到字符串的长度 -- trim(attribute) 去掉字符的空格 参考博客: Oracle ==>SQL 查询根据字符串的长度排序_清水绿草_新浪博客http://blog.sina.com.cn/s/blog_45

php 数组排序以及按照某个字段排序

经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用.PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序.在这篇文章中我们将讨论该排序中最重要的几个函数. 简单排序 首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列.PHP的sort()函数实现了这个功能,如Listing A所示: Listing A <?php  $data = a

Oracle的常用修改表及字段的语句

单行注释:-- 多行注释:/* */ Oracle中修改表结构 增加字段     ALTER TABLE table_name ADD column_name data_type; 删除字段     ALTET TABLE table_name DROP COLUMN column_name;修改字段类型     ALTER TABLE table_name ALTER COLUMN column_name new_data_type; 设置主键     ALTER TABLE table_na

字符串排序和多字段排序(string sorting and multi-fields)

被分词的string字段也是一个multi-value字段,但是对他们进行排序往往得不到想要的结果.如果你对"fine old art"进行分词,他将会返回三个term.我们也许对以一个term进行字母排序,然后第二个等.但是ES没有在这个期间的时间顺序. 你可以使用min和max排序模式(默认使用min),但是结果既不是art或者old也不是任何想要的结果. 为了对string field进行排序,这个field就只能是一个term:也就是一个not_analyzed类型的strin

ORACLE 五种表的优缺点总结

ORACLE 五种表的优缺点总结: 1.普通表(heap table):适合大部分设计场景,有长处也有缺点. 长处: a,语法简单方便 b,适合大部分场景 缺点: a,更新日志开销较大 b,Delete无法释放空间(HWM High Water Mark不下降) c,表记录太大检索太慢 d,索引回表读开销非常大 e,即便有序插入,也非常难保证有序读出 2,全局暂时表:适合接口表设计 长处: a,高效删除 b,产生非常少的日志 c,不同的SESSION独立,不产生锁 缺点: a,语法特别 b,数据

SQLSERVER和ORACLE批量处理表名和字段名大写

在sql移植到oracle过程中,都会遇到表名和字段名大写的问题,因为在oracle中默认表名和字段名都是大写的,虽然可以通过使用双引号的方式进行操作,如select * from "testtable"但是很多情况下,这样做的代价很大,因为很多程序的代码是早已经写好的,而要修改oracle系统配置又不安全,一个比较稳妥的办法是批量修改表名和文件名. 先说在SQL中修改表名和字段名的办法:虽然在sql中默认是不区分表名和字段名的大小写的,但是通过sql的DTS进行数据导出导入的时候,如

SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程

  第一种:单表多字段排序分页存储过程       --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( @TableName varchar(50), --表名 @ReFieldsStr varchar(200) = '*', --字段名(全部字段为*) @OrderString varchar(200), --排序字段(必须!支持多字段不用加order by) @WhereString varchar(500)

CakePHP下使用paginator需要对多个字段排序的做法

原文:http://blog.csdn.net/kunshan_shenbin/article/details/7644603 CakePHP下使用paginator需要对多个字段排序的做法 2012-06-08 11:03 448人阅读 评论(0) 收藏 举报 有的时候在进行翻页时需要对多个字段进行排序. 但是CakePHP的paginator的sort方法默认只能对一个字段进行排序. 解决的办法有2种: 1. 在model中追加一个虚拟字段: http://book.cakephp.org/