Я продолжаю получать эту проблему в моем программировании - PullRequest
0 голосов
/ 17 октября 2019

Транзакции будут взяты из таблицы хранения (NEW_TRANSACTIONS) и вставлены в таблицы TRANSACTION_DETAIL и TRANSACTION_HISTORY. соответствующий остаток на счете будет обновлен в таблице ACCOUNT.

Мой код продолжает получать эту проблему: «Точная выборка возвращает больше, чем запрошенный номер строки» таблица

Отчет об ошибке - ORA-01422: точная выборкавозвращает больше запрошенного числа строк ORA-06512: в строке 28 01422. 00000 - «точная выборка возвращает больше запрошенного количества строк» ​​* Причина: число, указанное в точной выборке, меньше, чем возвращенные строки. * Действие: переписать запрос или изменить количество запрошенных строк

ОБЪЯВИТЬ

r_new_trans NEW_TRANSACTIONS%ROWTYPE;
cursor c_trans_data IS
SELECT UNIQUE transaction_no, transaction_date,description, account_no, transaction_type, transaction_amount
FROM new_transactions;

TYPE UP_ACCOUNT IS RECORD (
      A_NO ACCOUNT.ACCOUNT_NO%type,
      A_TYPE_CODE account.account_type_code%type,
      A_BALANCE account.account_balance%TYPE,
      A_trans_type account_type.default_trans_type%type);

update_a UP_ACCOUNT;

--v_new_trans_amount TRANSACTION_DETAIL.TRANSACTION_AMOUNT%TYPE := 0;
v_new_balance ACCOUNT.ACCOUNT_BALANCE%TYPE := 0; 
v_transaction_debit NEW_TRANSACTIONS.TRANSACTION_TYPE%TYPE := 'D';
v_transaction_credit  NEW_TRANSACTIONS.TRANSACTION_TYPE%TYPE := 'C';
v_transaction_number  new_transactions.transaction_no%TYPE;

v_transaction_variable new_transactions.transaction_no%TYPE := 0;
v_transaction_deta_variable new_transactions.transaction_no%TYPE := 0;  

v_temp_balance account.account_balance%type := 0;

НАЧАТЬ

SELECT account_no, a.account_type_code, account_balance, default_trans_type into update_a
FROM ACCOUNT a JOIN ACCOUNT_TYPE at on a.account_type_code = at.account_type_code ;

--/1st cursor/
FOR r_trans IN c_trans_data LOOP
        IF(r_trans.TRANSACTION_NO <> v_transaction_variable)
        THEN 
            INSERT INTO TRANSACTION_HISTORY
            VALUES (r_trans.TRANSACTION_NO, r_trans.TRANSACTION_DATE,r_trans.DESCRIPTION);         
        END IF;
        v_transaction_variable := r_trans.TRANSACTION_NO;
        DBMS_OUTPUT.PUT_LINE('v_transaction_variable');

        IF(r_trans.TRANSACTION_NO <> v_transaction_variable)
        THEN 
            INSERT INTO TRANSACTION_DETAIL
            VALUES (r_trans.ACCOUNT_NO, r_trans.TRANSACTION_NO,r_trans.TRANSACTION_TYPE,r_trans.TRANSACTION_AMOUNT);         
        END IF;
        v_transaction_deta_variable:= r_trans.TRANSACTION_NO;
        DBMS_OUTPUT.PUT_LINE('v_transaction_deta_variable');

        IF r_trans.transaction_type <>  update_a.A_trans_type
            THEN 
            v_temp_balance := v_temp_balance - r_trans.TRANSACTION_AMOUNT;

            UPDATE account 
            SET account_balance = v_temp_balance
            WHERE account_no = r_trans.account_no;

        ELSIF r_trans.transaction_type = update_a.A_trans_type
            THEN 
            v_temp_balance := v_temp_balance + r_trans.TRANSACTION_AMOUNT;

            UPDATE account 
            SET account_balance = v_temp_balance
            WHERE account_no = r_trans.account_no;

        END IF; 
END LOOP;          

КОНЕЦ;

уже купилибудут взяты из таблицы хранения (NEW_TRANSACTIONS) и вставлены в таблицы TRANSACTION_DETAIL и TRANSACTION_HISTORY. соответствующий баланс счета будет обновлен в таблице ACCOUNT.

1 Ответ

0 голосов
/ 17 октября 2019

Вы столкнулись с проблемой в операторе SELECT .. INTO, так как он возвращает более 1 записи, и вы храните его в переменной типа UDT, которая предназначена для хранения только 1 записи.

Вам нужночтобы объявить это примерно так:

Type UP_ACCOUNT_TBL IS TABLE OF UP_ACCOUNT index by PLS_INTEGER;
update_a UP_ACCOUNT_TBL;

И ваш запрос на выборку должен выглядеть так:

SELECT UP_ACCOUNT(account_no, a.account_type_code, account_balance, default_trans_type) into update_a
FROM ACCOUNT a JOIN ACCOUNT_TYPE at on a.account_type_code = at.account_type_code ;

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...