現象が発生しました:
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