sql - PLSQL 错误 - PLS-00103 : Encountered the symbol "EXCEPTION" when expecting one of

标签 sql oracle plsql pls-00103

我是 PL/SQL 新手,需要您的帮助来解决以下错误。 在尝试编写脚本时,我不断收到以下内容。我试图下定决心并花一些时间来度过,但徒劳无功。 非常感谢您的答复/解决方案,谢谢:-)

ORA-06550: line 34, column 1:
PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following:

   ( begin case declare end 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
ORA-06550: line 52, column 4:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   end not pragma final instantiable order overriding static
   member constructor map

Script Terminated on line 5.

原脚本是:

DECLARE
    VRO_HISAL HISAL%ROWTYPE;
    VRO_LOSAL LOSAL%ROWTYPE;
    VRO_MSGS HILOSAL_MSG%ROWTYPE;

    V_SAL HISAL.SAL%TYPE;

    EX_BELOW10K EXCEPTION;
    EX_TOLOSAL EXCEPTION;

BEGIN

    SELECT NVL(MAX(EMPNO), 7000) + 1   INTO   VRO_HISAL.EMPNO   FROM   HISAL; 
    VRO_HISAL.ENAME  := '&NAME';
    VRO_HISAL.SAL    := &SALARY;

    VRO_LOSAL.EMPNO := VRO_HISAL.EMPNO;
    VRO_LOSAL.ENAME := VRO_HISAL.ENAME;
    VRO_LOSAL.SAL   := VRO_HISAL.SAL;

    IF VRO_HISAL.SAL < 10000 THEN
        RAISE EX_BELOW10K;

    ELSE IF VRO_HISAL.SAL > 10000 AND VRO_HISAL.SAL < 30000 THEN
        RAISE EX_TOLOSAL;

        ELSE 
            INSERT INTO HISAL VALUES (VRO_HISAL);
    END IF;

EXCEPTION
    WHEN EX_BELOW10K THEN
        SELECT NVL(MAX(MSGNO), 500) + 1    INTO   VRO_MSGS.MSGNO     FROM   HILOSAL_MSG;
        VRO_MSGS.MSGTXT := 'This salary  '||VRO_HISAL.SAL||'  is not a valid amount';
        VRO_MSGS.MSGTIME := TO_CHAR (SYSDATE, 'YYYY-MON-DD HH24:MI:SS');

    WHEN EX_TOLOSAL THEN
        INSERT INTO LOSAL VALUES VRO_LOSAL;

    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE ('Invalid operation.');

    WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE ('Result is more than expected.');

    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE ('Some other error occurred. Contact Admin.');

END;

使用的表:

TABLES: HISAL & LOSAL --2 tables with identical columns:

EMPNO NUMBER
EMPNAME VARCHAR2(20),
SAL NUMBER


TABLE 3: HILOSAL_MSG columns:

 MSGNO   NUMBER,
 MSGTXT  VARCHAR2(30),
 MSGTIME DATE

谢谢你, 干杯:-)

最佳答案

您的代码几乎没有问题。尝试如下:

DECLARE
   VRO_HISAL     HISAL%ROWTYPE;
   VRO_LOSAL     LOSAL%ROWTYPE;
   VRO_MSGS      HILOSAL_MSG%ROWTYPE;
   V_SAL         HISAL.SAL%TYPE;
   EX_BELOW10K   EXCEPTION;
   EX_TOLOSAL    EXCEPTION;
BEGIN
   SELECT NVL (MAX (EMPNO), 7000) + 1
     INTO VRO_HISAL.EMPNO   
     FROM HISAL;

   VRO_HISAL.ENAME := '&NAME';
   VRO_HISAL.SAL := &SALARY;

   VRO_LOSAL.EMPNO := VRO_HISAL.EMPNO;
   VRO_LOSAL.ENAME := VRO_HISAL.ENAME;
   VRO_LOSAL.SAL := VRO_HISAL.SAL;

   IF VRO_HISAL.SAL < 10000
   THEN
      RAISE EX_BELOW10K;
   ELSIF VRO_HISAL.SAL > 10000 AND VRO_HISAL.SAL < 30000
    THEN
      RAISE EX_TOLOSAL;
   ELSE
         INSERT INTO HISAL
              VALUES VRO_HISAL;
   END IF;       
EXCEPTION
   WHEN EX_BELOW10K
   THEN
      SELECT NVL (MAX (MSGNO), 500) + 1
        INTO VRO_MSGS.MSGNO
        FROM HILOSAL_MSG;

      VRO_MSGS.MSGTXT :=
         'This salary  ' || VRO_HISAL.SAL || '  is not a valid amount';
      VRO_MSGS.MSGTIME := TO_CHAR (SYSDATE, 'YYYY-MON-DD HH24:MI:SS');
   WHEN EX_TOLOSAL
   THEN
      INSERT INTO LOSAL
           VALUES VRO_LOSAL;
   WHEN NO_DATA_FOUND
   THEN
      DBMS_OUTPUT.PUT_LINE ('Invalid operation.');
   WHEN TOO_MANY_ROWS
   THEN
      DBMS_OUTPUT.PUT_LINE ('Result is more than expected.');
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE ('Some other error occurred. Contact Admin.');
END;

问题:

1) Misspelt ELSEIF; 2) Your table name has column empname and code ename 3) INSERT INTO HISAL VALUES (VRO_HISAL) at this statement brackets need to be removed.

关于sql - PLSQL 错误 - PLS-00103 : Encountered the symbol "EXCEPTION" when expecting one of,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41181929/

相关文章:

oracle - Oracle中oracle游标(select ..)查询的目的是什么?

oracle - PLSQL 流水线函数返回列表

sql - pl/sql中双竖线的使用

oracle - 设置除以 0 返回 0

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 如何防止将重复对插入到查找表中?

database - Oracle 索引勉强加速聚合计算

json - Oracle PL/SQL 是否提供了 JSON 模式验证器?

php - 需要使用 foreach 循环中的变量执行 SQL 查询

sql - 如何创建不考虑列顺序的唯一索引(设置?)