2016-12-16 16 views
1

私はPL/SQLを初めて使用しています。 スクリプトを試している間、私は以下を受け取ります。私は解決しようとしましたが、少し時間をかけて行きましたが、無駄でした。 回答/解像度がはるかに高く評価され、元のスクリプトがある:-)PLSQLエラー - PLS-00103:予期しているときに "EXCEPTION"シンボルが検出されました

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 

ありがとう、 乾杯:-)

答えて

3

あなたのコードにはほとんど問題がありません。以下のようにしてみてください。

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)つづりの間違っELSEIF。 2)テーブル名にカラムempnameがあり、コード ename 3)INSERT INTO HISAL VALUES (VRO_HISAL) 角括弧を削除する必要があります。

+1

私は最初の問題は、「if'終わる '行方不明」されていることはないと思います。代わりに、 'else'を' elsif'の代わりに使用していると思います。 – Boneist

+0

あなたの答えはありがとう、私はこれを検討しています.. –

+1

@ Boneist..Thanks。私は 'IFブロック'の中で 'IFブロック 'と考えて提案しました。とにかく私は 'if-elsif block 'に従って変更を加えました。 – XING

関連する問題