• 插入时排序


    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;
    
  • 相关阅读:
    mysql的四种隔离
    mysql-事物
    Mysql数据备份
    线程池
    springboot整合log4j2
    springboot项目部署
    数组去重
    倒叙输出算法
    使用LLDB和debugserver对ios程序进行调试
    Linux使用pyinstaller 编译py成可执行程序
  • 原文地址:https://www.cnblogs.com/linbl/p/4661857.html
Copyright © 2020-2023  润新知