Как разделить дебет и кредит в курсоре для цикла в plsql - PullRequest
0 голосов
/ 02 июня 2019

У меня есть cursor for loop сумма кредита и дебета моего ежедневного транзакционного счета, и я хочу показать их соответственно.

DECLARE

v_debit := 0;
v_credit := 0;

CURSOR c_acct_rec is 
select bk.acctname, bk.bsb, bk.accountnr, bk.value, bk.code
from mybank_tbl bk
r_acct_rec c_acct_rec%ROWTYPE;

FOR r_acct_rec in c_acct_rec LOOP
   if r_acct_rec.code = 'dr' then
      v_debit := show_debit;     
   else
      v_credit := v_credit + r_acct_rec;
   end if;

DBMS_OUTPUT.PUT_LINE(v_credit || v_debit); 

END LOOP;
END;

В этой части SQL-запроса из приведенного выше показаны все значения дебета и кредита.

+-----------------+
| value  | code | |
+-----------------+
| | 12   |  dr  | |
| |  5   |  dr  | |
| |  7   |  dr  | |
| | 33   |  dr  | |
| | 16   |  dr  | |
| | 1000 |  cr  | |
+-----------------+

Проблема, которую я обнаружил, потому что они находятся в цикле курсора, он заполняет все значения в одном столбце, как показано ниже

+-------+--------+
| Debit | Credit |
+-------+--------+
|    12 |        |
|     5 |        |
|     7 |        |
|    33 |        |
|    16 |        |
|  1000 |        |
+-------+--------+

Оператор if / else не может управлять им для отображения всех записей строк.

+-------+--------+
| Debit | Credit |
+-------+--------+
|    12 |    0   |
|     5 |    0   |
|     7 |    0   |
|    33 |    0   |
|    16 |    0   |
|  1000 |    0   |
|  1000 |  1000  |
+-------+--------+

Это способ отделить ее с помощью хранимой процедуры или отделить строку от значения учетной записи (r_acct_rec.value), чтобы проверить, чтобы получить этот ожидаемый результат?

+-------+--------+
| Debit | Credit |
+-------+--------+
|    12 |        |
|     5 |        |
|     7 |        |
|    33 |        |
|    16 |        |
|       |  1000  |
+-------+--------+

Ответы [ 3 ]

1 голос
/ 02 июня 2019

Другим вариантом является преобразование значения кода в отдельные значения в запросе и исключение кода для их определения.

declare
    cursor c_acct_rec is 
        select bk.acctname
             , bk.bsb
             , bk.accountnr
             , case when bk.code = 'dr' then bk.value else null end as debit
             , case when bk.code = 'cr' then bk.value else null end as credit         
        from mybank_tbl bk;

    r_acct_rec c_acct_rec%rowtype;

begin
    dbms_output.put_line(rpad('credit',10)|| ' | ' || rpad('debit',10)); 
    for r_acct_rec in c_acct_rec loop
        dbms_output.put_line(lpad(r_acct_rec.credit,10)|| ' | ' || lpad(r_acct_rec.debit,10)); 
    end loop;
end;
1 голос
/ 02 июня 2019

Ваше требование может быть выполнено только в SQL, оно не требует PL / SQL.

select 
bk.acctname, 
bk.bsb, 
bk.accountnr, 
bk.value, 
bk.code,
case 
    when bk.code = 'dr' then
    bk.value
end as debit,
case 
    when bk.code = 'cr' then
    bk.value
end as credit
from mybank_tbl bk
1 голос
/ 02 июня 2019

У вас есть две переменные. Вам нужно заполнить одно и пустое другое, в зависимости от значения code. Используйте функции пэда на дисплее для точного выравнивания выходного сигнала.

DECLARE

    v_debit number := 0;
    v_credit number := 0;

    CURSOR c_acct_rec is 
    select bk.acctname, bk.bsb, bk.accountnr, bk.value, bk.code
    from mybank_tbl bk
    r_acct_rec c_acct_rec%ROWTYPE;

BEGIN

    DBMS_OUTPUT.PUT_LINE(rpad('credit',10)|| ' | ' || rpad('debit',10)); 

    FOR r_acct_rec in c_acct_rec LOOP
       if r_acct_rec.code = 'dr' then
          v_credit := null;
          v_debit := r_acct_rec.value;     
       else
          v_credit := r_acct_rec.value;
          v_debit := null;
       end if;

    DBMS_OUTPUT.PUT_LINE(lpad(v_credit,10)|| ' | ' || lpad(v_debit,10)); 

    END LOOP;

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