根據業務需要,專案組長要求在oracle資料庫中對一系列資料進行查詢,前提是要用到日期(yyyy-mm-dd)查詢條件,如果查詢到資料的資料為空,則日期減1天繼續查詢,反覆迴圈...直到查詢到資料為止。ps:必須純sql邏輯查詢,不得涉及其他程式**
select tb.data1,tb.data2 from table tb where tb.date='2018-12-07'
很顯然,上述sql**段只能查詢對應日期的資料,即使查詢到的資料為空
假設所查詢的日期剛好有資料,則不需要進行一系列麻煩的操作,可直接進行sql查詢,如果你的運氣不是那麼好,那麼用剛才的sql會徒勞無功
既然日期條件會被多次用到,為何不寫乙個儲存函式供多次呼叫呢1、儲存函式fun_zjdt的建立
--建立儲存函式,判斷傳入的條件(日期和subid)所查詢到的總數是否大於0
create or replace function fun_zjdt(daily in varchar2,subid in varchar2)
return varchar2
isusefuldate varchar2(100);
--建立fun_zjdt儲存函式,並宣告接收資料的變數名稱(usefuldate )和型別(varchar2(100))
begin
select (
select
case
when count (days.weteam_subid) > 0
then daily
else fun_zjdt(to_char(to_date(daily,'yyyy-mm-dd')-1,'yyyy-mm-dd'),subid)
end
--如果查詢到的總數大於0就返回當前日期,否則'日期-1'遞迴執行該儲存函式
from drcd_aac_yerg_sd days
left join ccd_cse_sop_drant ccsd on ccsd.cogd_id = days.word_pide
where
days.bsfee='0' and
to_char(days.daily_date,'yyyy-mm-dd') = daily and
days.weram_subid like concat(subid,'%')
)into usefuldate --有資料的日期裝入到usefuldate中
from dual;
return (usefuldate); --返回有資料日期
end fun_zjdt; --結束函式
上述就是儲存函式的建立,接下來測試儲存函式是否可用
(說明:執行速度取決於當前查詢日期與有資料日期間隔的長短,間隔越大則執行速度越慢,反之越快)
select fun_zjdt('2302-06-01','c1') from dual;
執行結果
2、sql對儲存函式的呼叫
select
count (days.weteam_subid) total,
count (case when ccsd.coodqe like '04%' then 1 else null end) ba,
count (case when ccsd.coodqe like '06%' then 1 else null end) zj,
count (case when ccsd.coodqe like '05%' then 1 else null end) wj,
count (case when ccsd.coodqe like '07%' then 1 else null end) cz,
count (case when ccsd.coodqe like '02%' then 1 else null end) fz,
count (case when ccsd.coodqe like '03%' then 1 else null end) sg,
count (case when ccsd.coodqe like '01%' then 1 else null end) tg,
count (case when ccsd.coodqe like '09%' then 1 else null end) tc,
count (case when ccsd.coodqe like '10%' then 1 else null end) qt,
from drcd_aac_yerg_sd days
left join ccd_cse_sop_drant ccsd on ccsd.cogd_id=days.word_pide
where
to_char(days.daily_date,'yyyy-mm-dd') = (select fun_zjdt('2302-05-11','c1') from dual) and
days.weteam_subid like 'c1%'
order by days.weteam_subid
另外,遞迴查詢時如果遞迴的次數超過50時,就會報錯;提示(ora-00036:超過遞迴sql級別的最大值50 )如下圖!
真是印證了那句話:長江後浪推前浪,一浪更比一浪強(難) :-(
最終經過網上大量資料查詢,發現好多前輩們也遇到了此類問題,還是沒有比較好的解決方案。持續關注…
繼續關注此問題:
以上遞迴太過繁瑣,並且遞迴次數超過50時就會報錯。
所以說,現在找到了更好的辦法:查出小於條件日期的最大的日期作為查詢條件
select max(tt.date) as maxdate from tables tt where to_char(tt.date,'yyyy-mm-dd') <= '2018-12-22'
即可解決以上問題 oracle資料庫 儲存函式
一組封裝好的sql 語句集,提前編譯好,儲存在服務端。1 返回值 儲存函式必須有且只有乙個返回值,而儲存過程沒有return返回值。2 語法不同 儲存函式可以用在select語句中。儲存函式中一般不寫輸出引數。儲存函式可以與儲存過程互換,儲存函式可以在儲存過程中呼叫。1 基本語法結構 create ...
Oracle資料庫儲存過程和儲存函式
指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存過程 儲存函式。儲存過程沒有返回值。儲存函式有返回值 建立儲存過程 用create procedure命令建立儲存過程和儲存函式。語法 create or replace procedure過程名 引數列表 as plsql子程式體 儲存過程示例 為...
Oracle資料庫儲存結構
1.儲存結構 oracle資料庫的儲存結構分為邏輯儲存結構和物理儲存結構.圖 32.邏輯結構 邏輯儲存結構主要描述oracle資料庫的內部儲存結構,即從技術概念上描述在oracle資料庫種如何組織 管理資料.圖4 邏輯結構 從邏輯上來看.資料庫是由乙個或者多個表空間等組成。乙個表空間 tablesp...