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 ;
beginoracle游标的使用
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.ar,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;
⾥⾯的表和字段,可以换成⾃⼰需要的,忽略我⾃⼰的表信息;
希望对你有帮助,有问题留⾔讨论!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论