oracle 一種從按照某個欄位排序擷取連續的區間值得預存程序寫法

來源:互聯網
上載者:User

標籤:

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 一種從按照某個欄位排序擷取連續的區間值得預存程序寫法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.