資料庫 Oracle儲存函式 遞迴查詢介紹

2021-09-02 19:58:26 字數 3197 閱讀 2268

根據業務需要,專案組長要求在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...