2015-11-03 64 views
-2

代码:如何解决匿名PL/SQL块中的编译错误?

SET serveroutput ON; 
DECLARE 
    SUM NUMBER; 
    tot NUMBER; 
    tata NUMBER; 
    benz NUMBER; 
    FUNCTION accident 
    RETURN NUMBER 
    IS 
    z NUMBER; 
    BEGIN 
    SELECT COUNT(rid) 
    INTO tata 
    FROM participatedin, 
     Car 
    WHERE car.cid=participatedin.cid 
    AND model ='honda'; 
    SELECT COUNT(rid) 
    INTO benz 
    FROM participatedin, 
     Car 
    WHERE car.cid=participatedin.cid 
    AND model ='benz'; 
    SUM   :=tata+benz; 
    RETURN SUM; 
    END; 
BEGIN 
    tot:=accident(); 
    dbms_output.put_line("Honda+Benz= "||tot); 
END; 
/

错误:

ERROR at line 19: 
ORA-06550: line 19, column 11: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 
( 
+1

你应该给一个更具描述性的标题,让人们更容易看到你的问题。 –

+4

'sum'是一个函数名,我想这会让解析器感到困惑。再调用你的变量(也许在函数内部声明它,以及'tata'和'benz',而不是未使用的'z'?似乎更合适),看看是否能解决它。你的'dbms_output'会出错,因为你有双引号而不是单引号。 –

+0

正如Alex所说,变量'tata'和'benz'不在函数的范围内,而是使用它们。在函数声明中声明它们。 –

回答

1

没有与您匿名PL/SQL块多个问题:

  1. SUM NUMBER;

SUM是一个保留字在PL/SQL中。你不能直接使用它。使用双引号使其成为带引号的标识符,或使用不同的名称。

要查看保留字,做help reserved words的SQL * Plus

SQL> help reserved words 

RESERVED WORDS (PL/SQL) 
----------------------- 

PL/SQL Reserved Words have special meaning in PL/SQL, and may not be used 
for identifier names (unless enclosed in "quotes"). 

An asterisk (*) indicates words are also SQL Reserved Words. 

ALL*   DESC*   JAVA   PACKAGE   SUBTYPE 
ALTER*   DISTINCT*  LEVEL*   PARTITION  SUCCESSFUL* 
AND*   DO    LIKE*   PCTFREE*  SUM 
ANY*   DROP*   LIMITED   PLS_INTEGER  SYNONYM* 
ARRAY   ELSE*   LOCK*   POSITIVE  SYSDATE* 
AS*    ELSIF   LONG*   POSITIVEN  TABLE* 
ASC*   END    LOOP   PRAGMA   THEN* 
AT    EXCEPTION  MAX    PRIOR*   TIME 
AUTHID   EXCLUSIVE*  MIN    PRIVATE   TIMESTAMP 
AVG    EXECUTE   MINUS*   PROCEDURE  TIMEZONE_ABBR 
BEGIN   EXISTS*   MINUTE   PUBLIC*   TIMEZONE_HOUR 
BETWEEN*  EXIT   MLSLABEL*  RAISE   TIMEZONE_MINUTE 
BINARY_INTEGER EXTENDS   MOD    RANGE   TIMEZONE_REGION 
BODY   EXTRACT   MODE*   RAW*   TO* 
BOOLEAN   FALSE   MONTH   REAL   TRIGGER* 
BULK   FETCH   NATURAL   RECORD   TRUE 
BY*    FLOAT*   NATURALN  REF    TYPE 
CHAR*   FOR*   NEW    RELEASE   UI 
CHAR_BASE  FORALL   NEXTVAL   RETURN   UNION* 
CHECK*   FROM*   NOCOPY   REVERSE   UNIQUE* 
CLOSE   FUNCTION  NOT*   ROLLBACK  UPDATE* 
CLUSTER*  GOTO   NOWAIT*   ROW*   USE 
COALESCE  GROUP*   NULL*   ROWID*   USER* 
COLLECT   HAVING*   NULLIF   ROWNUM*   VALIDATE* 
COMMENT*  HEAP   NUMBER*   ROWTYPE   VALUES* 
COMMIT   HOUR   NUMBER_BASE  SAVEPOINT  VARCHAR* 
COMPRESS*  IF    OCIROWID  SECOND   VARCHAR2* 
CONNECT*  IMMEDIATE*  OF*    SELECT*   VARIANCE 
CONSTANT  IN*    ON*    SEPERATE  VIEW* 
CREATE*   INDEX*   OPAQUE   SET*   WHEN 
CURRENT*  INDICATOR  OPEN   SHARE*   WHENEVER* 
CURRVAL   INSERT*   OPERATOR  SMALLINT*  WHERE* 
CURSOR   INTEGER*  OPTION*   SPACE   WHILE 
DATE*   INTERFACE  OR*    SQL    WITH* 
DAY    INTERSECT*  ORDER*   SQLCODE   WORK 
DECIMAL*  INTERVAL  ORGANIZATION SQLERRM   WRITE 
DECLARE   INTO*   OTHERS   START*   YEAR 
DEFAULT*  IS*    OUT    STDDEV   ZONE 
DELETE*   ISOLATION 
  • dbms_output.put_line(tata+Benz ||' = '||tot);
  • 即不正确的语法。您需要离开变量并使用单引号仅用于字符串

    1. "Honda+Benz= "

    变量Honda未声明。看着你的代码,也许你想用tata

    尝试修改后的代码:

     
    SET serveroutput ON; 
    DECLARE 
        v_sum NUMBER; 
        tot NUMBER; 
        tata NUMBER; 
        benz NUMBER; 
        FUNCTION accident 
        RETURN NUMBER 
        IS 
        z NUMBER; 
        BEGIN 
        SELECT COUNT(rid) 
        INTO tata 
        FROM participatedin, 
         Car 
        WHERE car.cid=participatedin.cid 
        AND model ='honda'; 
        SELECT COUNT(rid) 
        INTO benz 
        FROM participatedin, 
         Car 
        WHERE car.cid=participatedin.cid 
        AND model ='benz'; 
        v_sum  :=tata+benz; 
        RETURN v_sum; 
        END; 
    BEGIN 
        tot:=accident(); 
        dbms_output.put_line(tata+Benz ||' = '||tot); 
    END; 
    /
    

    工作演示使用标准EMP表中SCOTT模式:

    SQL> SET serveroutput ON; 
    SQL> DECLARE 
        2 v_sum NUMBER; 
        3 tot NUMBER; 
        4 tata NUMBER; 
        5 benz NUMBER; 
        6 FUNCTION accident 
        7  RETURN NUMBER 
        8 IS 
        9  z NUMBER; 
    10 BEGIN 
    11  SELECT COUNT(empno) 
    12  INTO tata 
    13  FROM emp; 
    14  SELECT COUNT(empno) 
    15  INTO benz 
    16  FROM emp; 
    17  v_sum  :=tata+benz; 
    18  RETURN v_sum; 
    19 END; 
    20 BEGIN 
    21 tot:=accident(); 
    22 dbms_output.put_line('tata+Benz = '||tot); 
    23 END; 
    24/
    tata+Benz = 28 
    
    PL/SQL procedure successfully completed. 
    
    0

    更新你的代码更改参数“SUM”,因为它是Oracle中的一个函数。如果您将其更改为其他内容,则代码将起作用。
    看到改变的代码如下:

    DECLARE 
        sum1 NUMBER; 
        tot NUMBER; 
        tata NUMBER; 
        benz NUMBER; 
        FUNCTION accident RETURN NUMBER IS 
        z NUMBER; 
        BEGIN 
        SELECT COUNT(rid) 
         INTO tata 
         FROM participatedin, car 
        WHERE car.cid = participatedin.cid 
         AND model = 'honda'; 
        SELECT COUNT(rid) 
         INTO benz 
         FROM participatedin, car 
        WHERE car.cid = participatedin.cid 
         AND model = 'benz'; 
        sum1 := tata + benz; 
        RETURN sum1; 
        END; 
    BEGIN 
        tot := accident(); 
        dbms_output.put_line('Honda+Benz= ' || tot); 
    END; 
    /
    
    相关问题