CREATE OR REPLACE PROCEDURE  GetNewJb1
(startrq DATE,
 endrq DATE,
 jxlb IN OUT CHAR)
AS
BEGIN
  DELETE FROM newjb1;
  jxlb:='';
  
  INSERT INTO NewJb1(jxlb,lbmc,trans_head,col01,col02,col03,col04,
    col05,col06,col07,col08,col09,col10,col11,col12,col13,col14,
    col15,col16,col17,col18,col19,col20_H,col20,col21_H,
    col21,col22_H,col22,col23_H,col23,col24_H,col24,col25_H,col25)
  SELECT 
    jxlb,lbmc,trans_head,SUM(col01),SUM(col02),SUM(col03),SUM(col04),
    SUM(col05),SUM(col06),SUM(col07),SUM(col08),SUM(col09),
    SUM(col10),SUM(col11),SUM(col12),SUM(col13),SUM(col14),
    SUM(col15),SUM(col16),SUM(col17),SUM(col18),
    SUM(col19),SUM(col20_H),SUM(col20),SUM(col21_H),
    SUM(col21),SUM(col22_H),SUM(col22),SUM(col23_H),
    SUM(col23),SUM(col24_H),SUM(col24),SUM(col25_H),
    SUM(col25)
 FROM NewJb1Rj    
 GROUP BY jxlb,lbmc,trans_head
 ORDER BY  jxlb,trans_head;
 
END;

解决方案 »

  1.   

    我发现是
    order by 的地方出错了,
    如果没有这句就正确
    怎么加上这个就不行了??
      

  2.   

    还有下面这个部分加在后面怎么写?
    update NewJb1 set col19_h=case
                                  when col06 is null then 0
                                  when col06=0 then 0
                                  else round((col19/col06)*100,1)
                                end,
                        col20_h=case
                                  when col06 is null then 0
                                  when col06=0 then 0
                                  else round((col20/col06)*100,1)
                                end,
                        col21_h=case
                                  when col06 is null then 0
                                  when col06=0 then 0
                                  else round((col21/col06)*100,1)
                                end,
                        col22_h=case
                                  when col06 is null then 0
                                  when col06=0 then 0
                                  else round((col22/col06)*100,1)
                                end,
                        col23_h=case
                                  when col06 is null then 0
                                  when col06=0 then 0
                                  else round((col23/col06)*100,1)
                                end,
                        col24_h=case
                                  when col06 is null then 0
                                  when col06=0 then 0
                                  else round((col24/col06)*100,1)
                                end,
                        col25_h=case
                                  when col06 is null then 0
                                  when col06=0 then 0
                                  else round((col25/col06)*100,1)
                                end最后我想执行
    select * from NewJb1
    那位兄弟来指导一下,
    第一次在ORALCE下写SP
    还不太懂,
    还望指教一二
      

  3.   

    update NewJb1 set col19_h=decode(col06,null,0,0,col06,round((col19/col06)*100,1)),
                        col20_h=decode(col06,null,0,0,0,round((col20/col06)*100,1)),
                        col21_h=decode(col06,null,0,0,0,round((col21/col06)*100,1)),
                        col22_h=decode(col06,null,0,0,0,round((col22/col06)*100,1)),
                        col23_h=decode(col06,null,0,0,0,round((col23/col06)*100,1)),
                        col24_h=decode(col06,null,0,0,0,round((col24/col06)*100,1)),
                        col25_h=decode(col06,null,0,0,0,round((col25/col06)*100,1))
      

  4.   

    对了我是在oracle9.2.0下编译的,一点问题没有,你的是8i吧,那你就把order by 去掉吧。
      

  5.   

    1.利用子查询插入是不能有order by的,再说order by在这里也没什么作用,在使用select进行查
    询时加上order by也就行了。2. 你的update语句在Oracle8i以上版本是支持的,若不支持可以改为decode函数。
    col19_h=case
               when col06 is null then 0
               when col06=0 then 0
               else round((col19/col06)*100,1)
               end
    decode函数形式 col19_h=decode(col06,null,0,0,0,round((col19/col06)*100,1))3."最后我想执行select * from NewJb1"什么意思?在procedure中执行吗?那你得用游标,如果你想把select的结果输出还要用ref cursor.....,有很多类似的帖子。
      

  6.   

    create or replace procedure  GetNewJb1
    (startrq date,endrq date,jxlb in out char)
    as
    begin
      delete from newjb1;
      if jxlb is null then
      jxlb:='';
      end if;  insert into NewJb1(jxlb,lbmc,trans_head,col01,col02,col03,col04,
        col05,col06,col07,col08,col09,col10,col11,col12,col13,col14,
        col15,col16,col17,col18,col19,col20_H,col20,col21_H,
        col21,col22_H,col22,col23_H,col23,col24_H,col24,col25_H,col25)
      select 
        jxlb,lbmc,trans_head,sum(col01),sum(col02),sum(col03),sum(col04),
        sum(col05),sum(col06),sum(col07),sum(col08),sum(col09),
        sum(col10),sum(col11),sum(col12),sum(col13),sum(col14),
        sum(col15),sum(col16),sum(col17),sum(col18),
        sum(col19),sum(col20_H),sum(col20),sum(col21_H),
        sum(col21),sum(col22_H),sum(col22),sum(col23_H),
        sum(col23),sum(col24_H),sum(col24),sum(col25_H),
        sum(col25) from NewJb1Rj  
        where jxlb=jxlb and tjrq>=startrq and tjrq<=endrq
      group by jxlb,lbmc,trans_head;
      update NewJb1 set col19=col20+col21+col22+col23+col24+col25; 
      update NewJb1 set col07=col08+col09+col10+col11+col12+col13+col14+col15;
      update NewJb1 set col06=col07+col17+col18+col19 ;
      update NewJb1 set col01=col02+col03+col05+col06-col04 ;
      update NewJb1 set col19_h=decode(col06,null,0,0,0,round((col19/col06)*100,1));
      update NewJb1 set col20_h=decode(col06,null,0,0,0,round((col20/col06)*100,1));
      update NewJb1 set col21_h=decode(col06,null,0,0,0,round((col21/col06)*100,1));
      update NewJb1 set col22_h=decode(col06,null,0,0,0,round((col22/col06)*100,1));
      update NewJb1 set col23_h=decode(col06,null,0,0,0,round((col23/col06)*100,1));
      update NewJb1 set col24_h=decode(col06,null,0,0,0,round((col24/col06)*100,1));
      update NewJb1 set col25_h=decode(col06,null,0,0,0,round((col25/col06)*100,1));  declare cursor Cur_NewJb1 is select * from NewJb1;
      v_NewJb1 Cur_NewJb1%ROWTYPe;
      begin
      open   Cur_NewJb1 ;
      loop
      fetch cuR_NewJb1 into v_NewJb1;
      exit when Cur_NewJb1%notfound;
      dbms_output.put_line(V_NewJb1.jxlb,V_lbmc);/*这个地方有什么办法把newjb1中所有字段全输出,不要一个个写*/
      end loop;
      close Cur_NewJb1;
      commit;
      end; 
      
    grant all on getnewjb1  to public/*为什么加上这句就出错误了*/
    end;
    /  
      

  7.   

    奇怪,这个错误是什么意思啊
    SQL>  execute getnewjb1('01-04-03','01-04-03','N');
    BEGIN getnewjb1('01-04-03','01-04-03','N'); END;                                      *
    ERROR 位于第1行:
    ORA-06550: 第 1 行, 第 39 列:
    PLS-00363: 表达式 'N' 不能用作赋值目标
    ORA-06550: 第 1 行, 第 7 列:
    PL/SQL: Statement ignored
      

  8.   

    你的procedure
    create or replace procedure  GetNewJb1
    (startrq date,endrq date,jxlb in out char)中,jxlb是输入输出参数,你使用常量当然不行了。在SQL*PLUS中执行下面的语句
    declare
      jxlb  char(1) :='N';
    begin
     getnewjb1('01-04-03','01-04-03',jxlb);
    end;
    /
      

  9.   

    为什么我必须传入
    getnewjb1('01-4月-03','01-4月-03',jxlb);
    的日期格式才行啊?
    传01-04-2003就报错
      

  10.   

    还有就是我看书上也是grant all on getnewjb1  to public
    为什么我写在上面的就是不正确呢?
    而且我上面写的那个游标还没有任何的返回集
    怎么才能有呢?
      

  11.   

    1. '01-4月-03'是你的数据库服务器的缺省日期格式,所以一般为了不考虑日期格式,输入是都是采用to_date函数,使用自选的日期格式
    将getnewjb1('01-04-03','01-04-03',jxlb);改为
      getnewjb1(to_date('01-04-03','yy-mm-dd'),to_date('01-04-03','yy-mm-dd'),jxlb);2.grant all on getnewjb1  to public应该是DBA用户或system用户才可以执行吧!
    3. 要是想在SQL*PLUS中看到dbms_output.put_line打出的信息,要先在SQL*PLUS中执行set serveroutput on