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;