J'ai un 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> 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> L'instruction if / else ne peut pas le contrôler pour afficher tous les enregistrements de ligne. P> 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> 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.
+-------+--------+
| Debit | Credit |
+-------+--------+
| 12 | |
| 5 | |
| 7 | |
| 33 | |
| 16 | |
| | 1000 |
+-------+--------+
3 Réponses :
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;
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;
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
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
== code> qui n'est pas un opérateur valide, vous avez un
Stray code> avant le
puis code> , Je suppose que
dr code> est censé être la chaîne
'dr' code>, est
show_debit code> 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 code>, un pseudorecord, sur
v_credit code> 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 code> et
v_debit code> 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.