Oracle 存儲過程--游標循環調用函數/存儲過程


存儲過程的基本語法如下:

create or replace procedure procedure_name

as

begin

   extention;

end;

在sqlplus中調用存儲過程的方式:

begin

procedure_name;

end;

我的業務需求是:查詢自2015年1月1號以來的,每天的總訂單量(截止到當天的所有訂單),我需要接收一個時間,使訂單時間小於等於該時間,然后對訂單數計數,大概就是這樣;

這是一個需要運行的存儲過程:

CREATE OR REPLACE
procedure "RECYCLE_EVERY_DAY"
IS
begin
declare
--定義一個游標變量 ,將參數集合存進游標中
cursor every_day_list is
SELECT
TO_DATE( '2015-01-01', 'yyyy-MM-dd' ) + ROWNUM - 1 AS daylist
FROM
DUAL CONNECT BY ROWNUM <= trunc(
SYSDATE - to_date( '2015-01-01', 'yyyy-MM-dd' )) + 1 ;
--這個SQL是求出2015年1月1號至今為止的每一天的一個時間結果集

begin
--循環游標,取出游標中的每一個值,然后將值傳入到你需要的地方,比如另外一個存儲過程
for item in every_day_list LOOP
-- DBMS_OUTPUT.PUT_LINE(item.daylist); --打印出游標中的每一項
ADD_DATE_TEST(item.daylist);--ADD_DATE_TEST(item.daylist)是我的另外一個存儲過程
end loop;
end;
end RECYCLE_EVERY_DAY;

下面是我的需要參數的存儲過程:

CREATE OR REPLACE
PROCEDURE "ADD_DATE_TEST"(VS_DATE IN DATE) IS
BEGIN
DECLARE cursor
ORDER_TYPE_LIST is --聲明游標,將查詢結果集存入游標
SELECT DISTINCT
to_char( VS_DATE, 'yyyy' ) AS year,
CUSTOMER_TYPE,
COUNT(*) AS ORDER_NUMS,
SUM(COUNT(*)) over() AS ALL_ORDERS
FROM
T_ORDER_LIST
WHERE
TO_CHAR(join_time,'yyyy-MM-dd') <= TO_CHAR(VS_DATE,'yyyy-MM-dd')
GROUP BY to_char( VS_DATE, 'yyyy' ), CUSTOMER_TYPE ;

begin

FOR Itme in ORDER_TYPE_LIST LOOP --循環取出插入到相應的表
insert into ZT_FWDX_TB_NUMTONGBI_XRD (ID,YEAR,CUSTOMER_TYPE,ORDER_NUMS,SUM_NUM,CREATE_TIME,IS_HISTORY,DATE_MONTH,DATE_DAY)
values (SEQ_ZT_FWDX_NUMTONGBI_XRD.Nextval,Itme.year,Itme.KEHU_TYPE,Itme.ORDER_NUMS,Itme.ALL_ORDERS,VS_DATE,0,TO_CHAR(VS_DATE,'MM'),TO_CHAR(VS_DATE,'dd'));
end loop;
/*dbms_output.put_line(VS_DATE);*/--可以先試着打印出傳入的參數,看是否是需要的參數
end;
COMMIT;--提交事務
END ADD_DATE_TEST;

 

里面的表和字段,可以換成自己需要的,忽略我自己的表信息;

希望對你有幫助,有問題留言討論!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM