设计一个存储过程,打印出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;  帮帮忙看啊,在线等额~~

解决方案 »

  1.   


    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
      

  2.   

    这应该是道题目吧,这种分组求和的应该可以用sql跑出来的,就没必要用游标的
      

  3.   

    decode, sum與group by 配合就成了。
      

  4.   

    编译后出现了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)
     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的是不是这个原因呢