下面是儲存過程的一部分程式:
procedure sap_man_routing_so (citem_id varchar2,
csite_id varchar2,
ctype varchar2)
isv_routing varchar2 (40);
begin
if (citem_id not like '%c%')
then
select nvl (trim (rr.routing_id), '')
into v_routing
from (select mapl.plnnr || '_' || mapl.werks routing_id
from sap_mapl_qmcustomer mapl
where mapl.matnr = citem_id
and mapl.werks = csite_id
and exists
(select null
from sap_mapl_qmcustomer
where sap_mapl_qmcustomer.matnr =
citem_id
and sap_mapl_qmcustomer.werks =
csite_id)) rr;
elsif (citem_id like '%c%')
then
select nvl (trim (rr.routing_id), '')
into v_routing
from (select max (mapl.plnnr) routing_id
from sap_mapl_qmcustomer mapl
where mapl.matnr = citem_id and mapl.werks = csite_id) rr;
end if;
從**上來看,改程式似乎沒有什麼缺陷,執行也相當順暢,但有一天突然一直報
ora-01403: 未找到任何資料ora-06512: 在 "stg.sap_so_bom_proc", line 428
ora-06512: 在 "stg.sap_so_bom_proc", line 1097
通過分析發現缺少對結果集行數做乙個判斷,如果返回的是0行資料,那就是沒有值,沒有值就會報錯,
所以以下是對該程式進行判斷:
procedure sap_man_routing_so (citem_id varchar2,
csite_id varchar2,
ctype varchar2)
isv_routing varchar2 (40);
qty number;
begin
select count(*) into qty
from (select mapl.plnnr || '_' || mapl.werks routing_id
from sap_mapl_qmcustomer mapl
where mapl.matnr = citem_id
and mapl.werks = csite_id
and exists
(select null
from sap_mapl_qmcustomer
where sap_mapl_qmcustomer.matnr =
citem_id
and sap_mapl_qmcustomer.werks =
csite_id)) rr;
if qty>0 then
if (citem_id not like '%c%')
then
select nvl (trim (rr.routing_id), '')
into v_routing
from (select mapl.plnnr || '_' || mapl.werks routing_id
from sap_mapl_qmcustomer mapl
where mapl.matnr = citem_id
and mapl.werks = csite_id
and exists
(select null
from sap_mapl_qmcustomer
where sap_mapl_qmcustomer.matnr =
citem_id
and sap_mapl_qmcustomer.werks =
csite_id)) rr;
elsif (citem_id like '%c%')
then
select nvl (trim (rr.routing_id), '')
into v_routing
from (select max (mapl.plnnr) routing_id
from sap_mapl_qmcustomer mapl
where mapl.matnr = citem_id and mapl.werks = csite_id) rr;
end if;
else
--程式漏洞,沒有考慮返回值為0行的結果,現加判斷引數qty作為返回行數的總數,大於1將執行原先的程式,否則直接賦空值 add by zhangguipeng20170216
v_routing:='';
end if;
Oracle SQL程式優化案例二
有時候寫得不規範的sql語句真的是占用很多時間 以下是我在工作中發現的規律,如果欄位過多的使用函式,盡量不要將這些字段串聯在一起做匹配或查詢條件,比如紅色注釋部分,在執行紅色部分的時候 這個sql程式是執行了7分多鐘,但是將函式分開做匹配的戶查詢時間不用1秒 select ebeln ltrim s...
Oracle Sql優化筆記
基本的sql編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自動對sql語句進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用cbo cost based optimization,基於代價的優化方式 時。我們可以總結一下可能引起全表掃瞄的操作 oracle優化器...
Oracle Sql優化筆記
基本的sql 編寫注意事項 需要注意的是,隨著oracle的公升級,查詢優化器會自 動對sql語句 進行優化,某些限制可能在新版本的oracle下不再是問題。尤其是採用 cbo cost based optimization 基於代價的 優化方式 時。我們可以 總結一下可能引起全表 掃瞄的操作 or...