设计一个存储过程,打印出2008年1月到6月的某个店铺每月的销售额。存储过程的参数是店铺ID(DIANPUID),要求使用循环结构。打印过程使用DBMS_OUTPUT.PUT_LINE输出内容即可。格式如下:
店铺名称
月份 销售额
2008年1月 *****
2008年2月 *****
2008年3月 *****
2008年4月 *****
2008年5月 *****
2008年6月 *****提示:
(1)销售额的计算方法是按照店铺ID和每月的月份取出该月的订单,分别计算每个订单的总额,然后相加之后就是该月的销售总额。
(2)每个订单销售额计算按照第三题的方法进行计算。
(3)通过游标来遍历每个月份。
(4)查询条件可以按照店铺ID和月份来进行查询该店铺的每个月的订单。
下面是我写的代码:
create or replace procedure Mysale(dianpu_id ORDERS.dianpuid%type) is
i integer:=0;
total_sale float:=0;
cursor my_cursor is
select productprice,producttotal,ordertime from orders where dianpuid=dianpu_id and ordertime between to_date('20080101','YYYY-MM-DD') and to_date('20080630','YYYY-MM-DD');
cursorrecord my_cursor%rowtype;
begin
select dianpuname into name from dianpudetail where dianpuid=dianpu_id;
dbms_output.put_line('店铺名称 '||name);
dbms_output.put_line('月份 销售额');
for i in 1..6 loop
total_sale:=0;
open my_cursor;
fetch my_cursor into cursorrecord;
loop
EXIT when my_cursor% notfound;
if months_between(to_date('20080101','YYYY-MM-DD'),cursorrecord.ordertime)=(i-1) then
total_sale:=total_sale+cursorrecord.productprice*cursorrecord.producttotal;
end if;
end loop;
close my_cursor;
dbms_output.put_line('2008年'||i||'月'||' '||total_sale);
end loop;
end Mysale; 帮帮忙看啊,在线等额~~
店铺名称
月份 销售额
2008年1月 *****
2008年2月 *****
2008年3月 *****
2008年4月 *****
2008年5月 *****
2008年6月 *****提示:
(1)销售额的计算方法是按照店铺ID和每月的月份取出该月的订单,分别计算每个订单的总额,然后相加之后就是该月的销售总额。
(2)每个订单销售额计算按照第三题的方法进行计算。
(3)通过游标来遍历每个月份。
(4)查询条件可以按照店铺ID和月份来进行查询该店铺的每个月的订单。
下面是我写的代码:
create or replace procedure Mysale(dianpu_id ORDERS.dianpuid%type) is
i integer:=0;
total_sale float:=0;
cursor my_cursor is
select productprice,producttotal,ordertime from orders where dianpuid=dianpu_id and ordertime between to_date('20080101','YYYY-MM-DD') and to_date('20080630','YYYY-MM-DD');
cursorrecord my_cursor%rowtype;
begin
select dianpuname into name from dianpudetail where dianpuid=dianpu_id;
dbms_output.put_line('店铺名称 '||name);
dbms_output.put_line('月份 销售额');
for i in 1..6 loop
total_sale:=0;
open my_cursor;
fetch my_cursor into cursorrecord;
loop
EXIT when my_cursor% notfound;
if months_between(to_date('20080101','YYYY-MM-DD'),cursorrecord.ordertime)=(i-1) then
total_sale:=total_sale+cursorrecord.productprice*cursorrecord.producttotal;
end if;
end loop;
close my_cursor;
dbms_output.put_line('2008年'||i||'月'||' '||total_sale);
end loop;
end Mysale; 帮帮忙看啊,在线等额~~
CREATE OR REPLACE PROCEDURE mysale (dianpu_id orders.dianpuid%TYPE)
IS
i INTEGER := 0;
total_sale FLOAT := 0;
i_name VARCHAR2 (50); CURSOR my_cursor
IS
SELECT productprice, producttotal, ordertime
FROM orders
WHERE dianpuid = dianpu_id
AND ordertime BETWEEN TO_DATE ('20080101', 'YYYY-MM-DD')
AND TO_DATE ('20080630', 'YYYY-MM-DD'); cursorrecord my_cursor%ROWTYPE;
BEGIN
SELECT dianpuname
INTO i_name
FROM dianpudetail
WHERE dianpuid = dianpu_id; DBMS_OUTPUT.put_line ('店铺名称 ' || i_name);
DBMS_OUTPUT.put_line ('月份 销售额'); FOR i IN 1 .. 6
LOOP
total_sale := 0; OPEN my_cursor; FETCH my_cursor
INTO cursorrecord; LOOP
EXIT WHEN my_cursor%NOTFOUND; IF MONTHS_BETWEEN (TO_DATE ('20080101', 'YYYY-MM-DD'),
cursorrecord.ordertime
) = (i - 1)
THEN
total_sale :=
total_sale
+ cursorrecord.productprice * cursorrecord.producttotal;
END IF;
END LOOP; CLOSE my_cursor; DBMS_OUTPUT.put_line ('2008年' || i || '月' || ' ' || total_sale);
END LOOP;
END mysale;
有个name变量没定义啊,我重新定义了i_name
Line: 1
Text: CREATE OR REPLACE PROCEDURE mysale (dianpu_id orders.dianpuid%TYPE)Error: PL/SQL: Compilation unit analysis terminated
Line: 0
Text: CREATE OR REPLACE PROCEDURE mysale (dianpu_id orders.dianpuid%TYPE)
Compilation errors for PROCEDURE SYS.MYSALEError: PLS-00302: 必须说明 'DIANPUID' 组件
Line: 1
Text: CREATE OR REPLACE PROCEDURE mysale (dianpu_id orders.dianpuid%TYPE)Error: PL/SQL: Compilation unit analysis terminated
Line: 0
Text: CREATE OR REPLACE PROCEDURE mysale (dianpu_id orders.dianpuid%TYPE)
我的是9i的是不是这个原因呢