0
votes

Comment séparer un débit et un crédit dans un curseur pour boucle dans PL SQL

J'ai un curseur pour boucle code> Inclure le montant du crédit et du débit de mon compte de transaction quotidien, et je veux leur montrer respectivement. XXX PRE>

Cette partie du La requête SQL de ce qui précède montre toutes les valeurs de débit et de crédit. P> xxx pré>

Le problème que j'ai trouvé parce qu'ils sont dans la boucle du curseur, il remplacera toute valeur dans une colonne comme ci-dessous p> xxx pré>

L'instruction if / else ne peut pas le contrôler pour afficher tous les enregistrements de ligne. P> xxx pré>

est-ce un façon de le séparer à l'aide d'une procédure stockée ou séparer la ligne de la valeur du compte (R_ACCT_Rec.Value) pour vérifier pour obtenir ce résultat attendu? p>

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


2 commentaires

J'ai peur de ne pas pouvoir comprendre la question. Il serait utile que vous ayez posté un code de travail qui produisait la sortie que vous voyez. Dans votre deuxième pièce de code, vous utilisez == qui n'est pas un opérateur valide, vous avez un Stray avant le puis , Je suppose que dr est censé être la chaîne 'dr' , est show_debit vraiment une fonction qui ne prend aucun paramètre et retourne un valeur? Si oui, qu'est-ce que c'est censé faire? Et ensuite, vous ajoutez v_acct_rec , un pseudorecord, sur v_credit que je suppose est une variable numérique locale qui n'a pas de sens.


Si je suppose que toutes ces choses sont des artefacts que vous avez accidentellement introduit dans la posture de la question, ma vague devinette est que vous avez oublié de réinitialiser v_credit et v_debit sur chaque itération de la boucle à null si vous voulez que l'un des deux soit NULL et l'autre pour être non nul.


3 Réponses :


1
votes

Vous avez deux variables. Vous devez remplir un et vierge l'autre, en fonction de la valeur du code code>. Utilisez des fonctions de pad à l'écran pour aligner la sortie bien.

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;


0 commentaires

1
votes

Une autre option consiste à apporter la transformation de la valeur de code en valeurs distinctes de la requête et à éliminer le code pour la déterminer.

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;


0 commentaires

1
votes

Votre exigence peut être remplie dans SQL uniquement, elle ne nécessite pas 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


0 commentaires