插入时排序

CREATE OR REPLACE PROCEDURE ASSIGN_package_prize(arr in varchar_array, oldtypeid in varchar_array, CID NUMBER,numArr in varchar_array,FLAG NUMBER,ServerCount NUMBER, RETVAL OUT VARCHAR2) IS
  PRIZECODE  VARCHAR2(255);
   servernum number;
   servernumc VARCHAR2(2);
   prizetypenum number(6);
   prizetypenumc VARCHAR2(6);
   hashcoded VARCHAR2(8);
   flaged  number(2);
   forInt number(2);
   type type_array is table of number(6) index by binary_integer;
   var_array type_array;
BEGIN

IF (FLAG = 3) THEN
  --修改奖品状态
  DECLARE CURSOR c1 IS
      SELECT a.prizetypeid, a.prizecode FROM mkt_campaignprize a WHERE a.campaignid=CID AND a.issend=0;
  BEGIN
      FOR r1 IN c1 LOOP
         UPDATE mkt_prize b SET b.prizestate = 0 WHERE b.prizetypeid = r1.prizetypeid AND b.prizecode = r1.prizecode;
      END LOOP;
  END;
  --更新奖品库存数量字段
  DECLARE CURSOR c2 IS
      SELECT distinct(a.prizetypeid) FROM mkt_campaignprize a WHERE a.campaignid=CID AND a.issend=0;
  BEGIN
      FOR r2 IN c2 LOOP
         UPDATE mkt_prizetype b SET b.stockprizecount =
                (select count(*) from mkt_prize p where p.prizetypeid=r2.prizetypeid and p.prizestate=0)
                where b.prizetypeid=r2.prizetypeid;
      END LOOP;
  END;
  --删除campaignprize
  DELETE FROM mkt_campaignprize c WHERE c.campaignid=CID AND c.ISSEND = 0;

ELSE
  IF (FLAG = 1) THEN
    for i IN oldtypeid.first .. oldtypeid.last loop
          UPDATE MKT_PRIZE SET PRIZESTATE = 0 WHERE PRIZECODE IN (SELECT N.PRIZECODE FROM MKT_CAMPAIGNPRIZE N WHERE N.CAMPAIGNID=CID
            AND N.ISSEND = 0 AND N.PRIZETYPEID = oldtypeid(i)) AND PRIZETYPEID=oldtypeid(i);
          DELETE FROM MKT_CAMPAIGNPRIZE M WHERE M.CAMPAIGNID=CID AND M.ISSEND = 0 AND M.PRIZETYPEID=oldtypeid(i);

     end loop;
     DELETE FROM MKT_CAMPAIGNPACKAGE Y WHERE Y.CAMPAIGNID=CID;
  END IF;

 --获取上次插入时最后一条记录在那台服务器上
    servernum:=0;
    flaged:=0;
     select count(1) into flaged  from MKT_CAMPAIGNPRIZE where  issend=0 and rownum<2 order by campaignprizeid desc;
     if flaged>0 then
       select  to_number( substr(HASHCODE,0,2)) into servernum  from MKT_CAMPAIGNPRIZE where  issend=0 and rownum<2 order by campaignprizeid desc;
         if servernum is null then
           servernum:=0;
         end if;
      end if;

 --开始循环插入操作
  for k IN arr.first .. arr.last LOOP
      prizetypenum:=0;
      flaged:=0;
      for forInt in 0 ..ServerCount-1 loop
        prizetypenum:=0;
         servernumc:=lpad(forInt,2,‘0‘);
      select  count(1) into flaged from MKT_CAMPAIGNPRIZE where hashcode like ‘‘||servernumc||‘%‘ and prizetypeid=arr(k) and CAMPAIGNID=CID and rownum<=1 order by campaignprizeid asc;
        if flaged>0 then
            with cet as(select  *  from MKT_CAMPAIGNPRIZE where hashcode like ‘‘||servernumc||‘%‘ and prizetypeid=arr(k) and CAMPAIGNID=CID   order by campaignprizeid desc  ) select hashcode into hashcoded from cet where  rownum<=1;
            if hashcoded is not null  then
             prizetypenum:=to_number(substr(hashcoded,3,6));
             prizetypenum:=prizetypenum+1;
             end if;
           end if;
           var_array(forInt):=prizetypenum;
          end loop;
     --插入到活动礼品表操作

          --
          DECLARE CURSOR c3 IS
          SELECT T.PRIZECODE from MKT_PRIZE T WHERE T.PRIZETYPEID=arr(k) AND T.PRIZESTATE = 0 AND ROWNUM <= numArr(k);
          BEGIN
             FOR r3 IN c3 LOOP
                servernum:=servernum+1;
                if servernum=ServerCount then
                 servernum:=0;
                 end if;
                 servernumc:= lpad(servernum,2,‘0‘);
                 prizetypenumc:=lpad(var_array(servernum),6,‘0‘);
                 hashcoded:= servernumc||prizetypenumc;
                  var_array(servernum):= var_array(servernum)+1;
                INSERT INTO MKT_CAMPAIGNPRIZE  values( MKT_CAMPAIGNPRIZE_S.NEXTVAL,SYSDATE,NULL,SYSDATE,NULL,CID,NULL,0,r3.PRIZECODE,0,arr(k),NULL,hashcoded );
              END LOOP;
            END;
          --

       UPDATE MKT_PRIZE SET PRIZESTATE = 1
        WHERE PRIZECODE IN (SELECT C.PRIZECODE FROM MKT_CAMPAIGNPRIZE C WHERE C.CAMPAIGNID=CID AND C.PRIZETYPEID=arr(k)) AND PRIZETYPEID=arr(k);
  end loop;
END IF;

 COMMIT;
  RETVAL := ‘1‘;
  Exception
     When others then
       RETVAL :=SUBSTR(SQLERRM, 1, 600);
       Rollback;

END ASSIGN_package_prize;
时间: 2024-08-03 12:24:32

插入时排序的相关文章

php插入式排序的两种写法。

百度了下插入式排序,百度百科中php版本的插入式排序如下: 1 function insert_sort($arr) { 2 // 将$arr升序排列 3 $count = count($arr); 4 for ($i=1; $i<$count; $i++) { 5 $tmp = $arr[$i]; 6 $j = $i - 1; 7 while ($j >=0 && $arr[$j] > $tmp) { 8 $arr[$j+1] = $arr[$j]; 9 $j--; 1

MyBatis 插入时返回刚插入记录的主键值

MyBatis 插入时返回刚插入记录的主键值 一.要求: 1.数据库表中的主键是自增长的,如:id: 2.获取刚刚插入的记录的id值: 二.源代码: 1.User.java 1 package cn.com.zfc.model; 2 3 public class User { 4 5 private Integer id; 6 private String name; 7 private String password; 8 9 public Integer getId() { 10 retur

Oracle下用rownum进行分页时排序的错乱 .

今天早上用户打电话说系统的排序有问题,仔细看了一下,问题好像是出在ROWNUM这个函数上. 在Oracle下ROWNUM函数是对查询结果按照顺序分配自增行序号,所以很多人都利用这个特点进行分页操作,即rownum between 30 and 60,这种限制返回行数的小窍门在普通情况下都很正常,但如果要对返回结果在进行排序就变得乱套了. 如下查询: select page.* from( select rownum page_id,    id,    unit_code,    name,  

插入类排序:直插,折半插,希尔

插入类排序: 1:直接插入排序O(n^2) 2:折半插入排序O(n^2) 3:希尔排序 O(n乘以log以2为底,n的对数) 空间复杂度都是O(1) //直接插入排序 void InsertSort(int R[],int n) { int i,j; int tmp; for(i=1;i<n;i++)//数组下标从0开始,第一个有序,所以从1开始 { tmp=R[i]; j=i-1; while(j>=0 && tmp<R[j])//元素右移,以便插入 { R[j+1]=

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问题 [CSDN博客] mysql 主从复制 双主从复制原理 防止主键重复问题(必看) [CSDN博客] replace into导致mysql自增列导致主键重复问题分析 [CSDN博客] 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql) [CSDN博客] mysql i

sql语句插入时提示:“Duplicate entry &#39;XXX&#39; for key 1 ” 是什么原因?

你用的是MYSQL 数据库吧? 1:提示信息翻译:插入 xxx 使索引1重复分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性.否则就会产生这个错误.一般发生在对数据库写操作的时候,例如Discuz!4.1论坛程序要求所有会员的用户名username必须唯一,即username 的索引是unique,这时如果强行往cdb_members表里插入一个已有的username的记录就会发上这个错误,或者将一条记录的username更新为已有

详谈排序算法之插入类排序(两种思路实现希尔排序)

1. 排序( sorting) 的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.其确切的定义为: 假设有n个数据元素的序列{R1 , R2 , - , Rn},其相应关键字的序列是{K1 , K2 , - , Kn} ,通过排序要求找出下标 1 , 2 , - , n的一种排列p1 , p2 , - , pn,使得相应关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤ - ≤ Kpn这样,就得到一个按关键字有序的纪录序列{ Rp1 , Rp2 , - , Rpn }

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

插入类排序(直接插入排序)

1.直接插入排序 1)时间复杂度:T(n)=O(n^2); 2)空间复杂度:S(n)=O(1);             3)简介:直接插入排序是一种最基本的插入排序方法,直接插入排序(Straight Insertion Sorting)的基本思想是把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程 中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程.把a[i]插入到a[0