標籤:
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後再去資料庫查對應的記錄 更新對應的記錄就不會有資源衝突。
oracle 一種從按照某個欄位排序擷取連續的區間值得預存程序寫法