【问题标题】:PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:
【发布时间】:2016-11-03 23:44:30
【问题描述】:

我很难弄清楚为什么这段代码没有编译。我得到的确切错误是:

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”中获取一堆事务,并将它们添加到另外几个表中,“Account”、“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;
/

【问题讨论】:

  • 您已经清楚地注释掉了某种或类似构造的END。只需简化,简化,简化并逐块添加代码。
  • 我知道这需要时间,但是像这样格式化一些代码非常值得花时间。你有没有在声明下排列的开始,在你的循环开头没有排列的结束循环缺少缩进。格式化后,很快就会清楚 jayant Sahewal 在下面的答案是正确的,并且两个末端循环之间缺少末端。

标签: sql oracle plsql oracle11g accounting


【解决方案1】:

我没有看到您的其中一个 BEGIN 语句的 END。您在第一个 END LOOP 语句之后缺少 END。

BEGIN
FOR r_test IN c_new_trans LOOP
                        ....
END LOOP;
END;

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 2015-07-07
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2014-09-18
    • 2012-10-26
    相关资源
    最近更新 更多