CREATE OR REPLACE PROCEDURE Query1
AS
  CNT_PART NUMBER(10) := 0;
  SUM_PART NUMBER(10) := 0;
  AVG_PART NUMBER(10) := 0;BEGIN
SELECT COUNT(*),SUM(p_retailprice),AVG(p_retailprice) INTO CNT_PART,SUM_PART,AVG_PART
FROM part  
WHERE  PS_PARTKEY IN 
(SELECT P_PARTKEY
 FROM PART
 WHERE P_NAME LIKE 'B%' ) AND PS_AVAILQTY > (SELECT 0.5 * SUM(L_QUANTITY)
            FROM LINEITEM
            WHERE L_PARTKEY = PS_PARTKEY
        AND L_SUPPKEY = PS_SUPPKEY
        AND L_SHIPDATE <= '31-DEC-2003'
        AND L_SHIPDATE > '12-MAY-2002')
            
group by p_retailprice; 
EXCEPTION WHEN OTHERS THEN ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Error:'||SQLERRM);
END Query1;
/

解决方案 »

  1.   

    L_SHIPDATE是字符类型吗?
    group by p_retailprice 不用分组吧
      

  2.   

    把你的sql,放到pl-sql中运行一下,看一看,报什么错误
      

  3.   

    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/1      PL/SQL: SQL Statement ignored
    4/66     PL/SQL: ORA-00907: missing right parenthesis
    4/67     PLS-00103: Encountered the symbol ")" when expecting one of the
             following:
             ( begin case declare end exception exit for goto if loop mod
             null pragma raise return select update while with
             <an identifier> <a double-quoted delimited-identifier>
             <a bind variable> << continue close current delete fetch lock
             insert open rollback savepoint set sql execute commit forall
             merge pipe purge
      

  4.   

    所报之错是缺少右括号,把子查询放到sql里,有什么结果呢
      

  5.   

    单看语句没啥错误。
    楼主你的书写习惯看着很难受。
    plsql developer-->edit->pl/sql beautifier 
      

  6.   


    把你的过程中的改成下面的
    SELECT COUNT(1),SUM(p_retailprice),AVG(p_retailprice) INTO CNT_PART,SUM_PART,AVG_PART
    FROM part 
    WHERE PS_PARTKEY IN  
    (SELECT P_PARTKEY FROM PART WHERE P_NAME LIKE 'B%' ) 
    AND PS_AVAILQTY > (SELECT (0.5 * SUM(L_QUANTITY)) FROM LINEITEM WHERE L_PARTKEY = PS_PARTKEY AND L_SUPPKEY = PS_SUPPKEY
    AND L_SHIPDATE >('2003-05-12','yyyy-mm-dd') and to_date(L_SHIPDATE) <=to_date('2003-12-31','yyyy-mm-dd') )
    group by p_retailprice; 
      

  7.   

    group by p_retailprice
    没有什么意义
    对于聚合函数以外的字段必须放置到group by子句中
      

  8.   

    单独看看SELECT COUNT(1),SUM(p_retailprice),AVG(p_retailprice) INTO CNT_PART,SUM_PART,AVG_PART
    FROM part  
    WHERE PS_PARTKEY IN   
    (SELECT P_PARTKEY FROM PART WHERE P_NAME LIKE 'B%' )  
    AND PS_AVAILQTY > (SELECT (0.5 * SUM(L_QUANTITY)) FROM LINEITEM WHERE L_PARTKEY = PS_PARTKEY AND L_SUPPKEY = PS_SUPPKEY
    AND to_date(L_SHIPDATE) >to_date('2003-05-12','yyyy-mm-dd') and to_date(L_SHIPDATE) <=to_date('2003-12-31','yyyy-mm-dd') )
    group by p_retailprice;