2016-11-03 10 views
-1

このコードがコンパイルされない理由を理解するのは苦労しています。取得正確なエラーイムは、次のとおりです。PLS-00103:次のいずれかが予想される場合、シンボル "end-of-file"が発生しました。

ERROR at line 82: 
ORA-06550: line 82, column 4: 
PLS-00103: Encountered the symbol "end-of-file" 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 

私は一時テーブルからのトランザクションの束で「new_Transactions」を取られませんし、別のカップルのテーブルにそれらを追加しようとしている、「アカウント」、「Transaction_History "および" Transaction_Detail " new_transactionテーブルは各トランザクションに対して複数の借方と貸方を持つことができるので、ネストされたトランザクションはすべてのトランザクションをファイルに読み込む必要があります。

かなりの間エラーがどこにあるのか分かりませんでしたが、SQLは私の強みではないことを認めます。ひどい間違いがあれば教えてください。

DECLARE 
r_transaction NEW_TRANSACTIONS%ROWTYPE; 
CURSOR c_trans_no IS 
SELECT * 
INTO r_transaction 
FROM new_transactions 
ORDER BY transaction_no; 

v_credit_check NEW_TRANSACTIONS.TRANSACTION_AMOUNT%TYPE; 
v_debit_check NEW_TRANSACTIONS.TRANSACTION_AMOUNT%TYPE; 


BEGIN 

FOR r_transaction IN C_trans_no LOOP 
    v_debit_check:=0; 
    v_credit_check:=0; 
      DECLARE 
       r_test NEW_TRANSACTIONS%ROWTYPE; 
       CURSOR c_new_trans IS 
       SELECT * 
       INTO r_test 
       FROM new_transactions 
       WHERE transaction_no = r_transaction.transaction_no; 

        BEGIN 
         FOR r_test IN c_new_trans LOOP 
         DECLARE 
         v_number NUMBER(8,2); 
         rec_account ACCOUNT%ROWTYPE; 
         BEGIN 
         SELECT * 
         INTO rec_account 
         FROM ACCOUNT 
         WHERE account_no = r_test.account_no; 

         INSERT INTO TRANSACTION_HISTORY(transaction_no, transaction_date, description) 
         VALUES (r_test.transaction_no, r_test.transaction_date, r_test.description); 
         INSERT INTO TRANSACTION_DETAIL(account_no, transaction_no, transaction_type, transaction_amount) 
         VALUES (r_test.account_no, r_test.transaction_no, r_test.transaction_type, r_test.transaction_amount); 

         IF(r_test.transaction_type = 'D') THEN 
          v_debit_check := v_debit_check + r_test.transaction_amount; 
          CASE rec_account.account_type_code 
           WHEN 'A' THEN v_number := r_test.transaction_amount; 
           WHEN 'L' THEN v_number := -r_test.transaction_amount; 
           WHEN 'EX' THEN v_number := r_test.transaction_amount; 
           WHEN 'RE' THEN v_number := -r_test.transaction_amount; 
           WHEN 'OE' THEN v_number := -r_test.transaction_amount; 
          END CASE; 
          UPDATE ACCOUNT 
          SET account_balance = account_balance + v_number 
          WHERE r_test.account_no = rec_account.account_no; 
         ELSIF(r_test.transaction_type = 'C') THEN 
          v_credit_check := v_credit_check + r_test.transaction_amount; 
          CASE rec_account.account_type_code 
           WHEN 'A' THEN v_number := -r_test.transaction_amount; 
           WHEN 'L' THEN v_number := r_test.transaction_amount; 
           WHEN 'EX' THEN v_number := -r_test.transaction_amount; 
           WHEN 'RE' THEN v_number := r_test.transaction_amount; 
           WHEN 'OE' THEN v_number := r_test.transaction_amount; 
          END CASE; 
          UPDATE ACCOUNT 
          SET account_balance = account_balance + v_number 
          WHERE r_test.account_no = rec_account.account_no; 
         --ELSE 
          --ROLLBACK; 
          --INSERT INTO WKIS_ERROR_LOG(transaction_no, transaction_date, description, error_msg) 
          --VALUES (r_test.transaction_no, r_test.transaction_date, r_test.description, 'Not a Debit or a Credit'); 
         END IF; 

         END lOOP; 
      --IF(v_credit_check != v_debit_check) THEN 
      --ROLLBACK; 
      --INSERT INTO WKIS_ERROR_LOG(transaction_no, transaction_date, description, error_msg) 
      --VALUES (r_transaction.transaction_no, r_transaction.transaction_date, r_transaction.description, 'Not a Debit or a Credit'); 
      --END IF;  


END LOOP; 

END; 
/
+3

あなたは、ある種の並べ替えや同様の構文の 'END'をはっきりとコメントしました。コードブロックを単純化、簡素化、簡素化、追加するだけです。 –

+2

私は時間がかかることを知っていますが、このようなコードを書式設定することは、時間を費やす価値があります。あなたは宣言の下に並んでいない始まりを持っています。あなたのループの初めにインデントがない行に並んでいない終わりのループ。フォーマットが完了すると、以下のjayant Sahewalの答えが正しいことと、2つのエンドループの間に欠けがあることがすぐに分かります。 –

答えて

1

あなたのBEGINステートメントの1つでは、ENDは表示されません。最初のEND LOOP文の後にENDがありません。

BEGIN 
FOR r_test IN c_new_trans LOOP 
         .... 
END LOOP; 
END; 
関連する問題