基準限界のシーケンスにマージ

著作権の帰属:Tiankaiテクノロジー
このリンク: https://blog.csdn.net/dbs_service/article/details/102760824

現象が発生しました:
PLSQLブロックサービスが正常に動作しますが、テーブルの主な建設されS_VipShopStock深刻なジャンプの数は、空にするために一連の復興とキャッシュパラメータの後、最初の時間MAX(ID)600、次回の実行ID 1200のために実行我々は問題を解決することはできません。

オリジナルサービス(2秒に一度実行):

begin
merge into mbs7_oms.XS_VipShopStock a using
(Select
c.stylecode,
c.warecode,
sum(b.amount) qty,
0,
c.websitecode,
33
From mbs7_oms.cg_batch a
Join mbs7_oms.cg_batchsub b
join mbs7_oms.xs_ware c
on b.warecode = c.warecode
and c.prodlinecode = '33' On a.batchcode = b.batchcode
Where b.amount > 0
And a.status In (0, 1)
And a.arrivaldate > Sysdate
group by c.stylecode, c.warecode, c.websitecode) b
on(a.warecode=b.warecode)
WHEN MATCHED THEN 
update set a.stockqty=b.qty where a.stockqty<>b.qty
WHEN NOT MATCHED THEN
INSERT values(SEQ_XS_VipShopStock.Nextval,b.stylecode,b.warecode,b.qty,0,b.stylecode,33);
commit;

オリジナルの定義されたシーケンスを表示します。

create sequence SEQ_XS_VIPSHOPSTOCK
minvalue 1
maxvalue 1000000000000000
start with 1
increment by 1
cache 20

その後に変更:

create sequence SEQ_XS_VIPSHOPSTOCK
minvalue 1
maxvalue 1000000000000000
start with 1
increment by 1
nocache
order;

問題はまだあります!

分析:
使用すると、コールにマージは、プリコンパイルに似ているにかかわらず、マッチや実装の成功を一致していないかどうかの、組み合わせ順序を割り当てられ、適切な値への呼び出しを指示します。機能を使用すると、値のシーケンスを無駄にしませんので、彼らは、プリコンパイル時の値を知ることができないので、将来的に閉じていないので、何の前処理、およびされます。ただし、関数を使用すると、パフォーマンスが少し無償電話を増加させるので、それは、別の問題をもたらす、懸念しています。だから、彼らの実際の状況に応じて、自分自身を選択することが最善です。

ソリューション:
シリアル番号の伝達関数を作成します。

create or replace function get_sequence_nextval(f_schema in varchar2, f_sequence_name in  varchar2) return number  is  
  v_nextval         number;  
begin  
  execute immediate 'select ' || f_schema || '.'||f_sequence_name||'.nextval from dual' into v_nextval;  
 return v_nextval;  
exception  
  when others then  
   raise_application_error(sqlcode,sqlerrm);  
end;  

サービス参照の機能を変更します。

begin
    merge into mbs7_oms.XS_VipShopStock a using
     (Select
           c.stylecode,
           c.warecode,
           sum(b.amount) qty,
           0,
           c.websitecode,
           33
      From mbs7_oms.cg_batch a
      Join mbs7_oms.cg_batchsub b
      join mbs7_oms.xs_ware c
        on b.warecode = c.warecode
       and c.prodlinecode = '33' On a.batchcode = b.batchcode
     Where b.amount > 0
       And a.status In (0, 1)
       And a.arrivaldate > Sysdate
     group by  c.stylecode, c.warecode, c.websitecode) b
     on(a.warecode=b.warecode)
     WHEN  MATCHED THEN
        update set a.stockqty=b.qty where a.stockqty<>b.qty
      WHEN  NOT MATCHED THEN
        INSERT  values(get_sequence_nextval('MBS7_OMS','SEQ_XS_VIPSHOPSTOCK'),b.stylecode,b.warecode,b.qty,0,b.websitecode,33);
    commit;  

問題解決には、シリアル番号は、現象をジャンプしませんでした!


DBAの例以上の更新は、私たちにCSDNのブログに従ってください!
Https://topdbs.blog.csdn.net

おすすめ

転載: blog.csdn.net/dbs_service/article/details/102760824