1

LOOPS、レコード、コレクションについて学んでいます。私は、1500 ドルの寄付誓約額の支払いスケジュールのために取り組んでいるプログラムを持っています。PL/SQL プログラムは 24 か月の支払いスケジュールを実行し、ID '111' の寄付者の dd_pledge という名前の寄付テーブルから残高を取得し、各支払いの支払い額を表示し、各支払いの前に 24 回の支払いを BALANCE で表示します。ゼロバランスに。以下にテーブル情報を含めましたが、そのテーブルから 1 つの値のみをコレクションに挿入し、それに対して計算を実行しています。これは、支払いの望ましい結果です。

匿名ブロック完了


支払い番号: 1 期限: 2012 年 10 月 1 日 金額: $62.50 残高: $1,437.50


支払い #: 2 期日: 2012 年 11 月 1 日 金額: $62.50 残高: $1,375.00


... 支払番号: 23 期日: 2014 年 8 月 1 日 金額: $62.50 残高: $62.50


支払い番号: 24 期限: 2014 年 9 月 1 日 金額: $62.50 残高: $.00

プログラムの開始日は「2012 年 10 月 1 日」で、支払い額は 24 回払いで 62.50 です。

このプログラムに RECORD と LOOP を使用していますが、機能していません。

LOOP で PAYMENT BALANCE の繰り返しに GUIDANCE を使用し、MONTH で NOV に 1 か月を追加し、それを全体で使用することもできます。ここで、コレクション パーツをコーディングに追加し、LOOP でそれらの値を呼び出す必要があります。

これは私の更新されたコーディングで、少し単純ですが、LOOP への BALANCE 計算エントリについてはわかりません。また、2012 年 10 月 1 日からの支払い日は 11 月 1 日になり、それを日付として使用します。私はまだコレクションについて学んでいます。

SET SERVEROUTPUT ON
DECLARE
payment_num                      NUMBER(2) := 0;
d_loop_count                     NUMBER(2) := 24;
due_date                         DATE;
payment_amt                      NUMBER(8, 2) := 62.50;
donation_balance                 NUMBER(8,2); 
pledgeamt                        NUMBER(8,2) := 1500;
---This pledgeamt is not correct, involved in Collection called value from TABLE
start_date                       DATE :=  '01-OCT-2012'; 

BEGIN
 /*
 SELECT pledgeamt  INTO donation_balance
    FROM dd_pledge
    WHERE idpledge = '111';  --111 has a pledge amount of $1500
*/
FOR i IN 1..d_loop_count
LOOP
payment_num :=payment_num + 1;
due_date := add_months(start_date, 1);
donation_balance := (pledgeamt - payment_amt);

dbms_output.put_line
(
'Pay #: ' || payment_num 
|| ' ' || 'Due: ' || due_date
|| ' ' ||  'Amt: ' || payment_amt
|| ' ' || 'Bal: '|| donation_balance
);

END LOOP;

END;
/

これがスプールが私に与えるものです。進行中ですが、LOOP の繰り返しと、寄付金の支払い残高の計算、および支払いシーケンスの MONTH カウントダウンについて、もう少し支援が必要です。

    anonymous block completed
Pay #: 1 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 2 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 3 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 4 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
...Pay #: 20 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 21 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 22 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 23 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 24 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5

以下は、寄付テーブルから LOOP に残高を入力するために使用するテーブル情報です。

TABLE dd_pledge情報は

IDPLEDGE    NUMBER(5,0) No      1   
IDDONOR NUMBER(4,0) Yes     2   
PLEDGEDATE  DATE    Yes     3   
PLEDGEAMT   NUMBER(8,2) Yes     4   
IDPROJ  NUMBER(5,0) Yes     5   
IDSTATUS    NUMBER(2,0) Yes     6   
WRITEOFF    NUMBER(8,2) Yes     7   
PAYMONTHS   NUMBER(3,0) Yes     8   
CAMPAIGN    NUMBER(4,0) Yes     9   
FIRSTPLEDGE CHAR(1 BYTE)    Yes     10

111 ROW equals:

IDPLEDGE   IDDONOR         PLEDGEDATE         PLEDGEAMT
111        306         01-MAR-13          1500                                      

 etc...
 504       20   0   756   Y

これは、他の人が PL/SQL COLLECTIONS についてさらに学ぶために私が取り組んでいるものであるコレクション、レコードに関するセクションです。http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#CHDBHJEI

4

3 に答える 3

0
SET SERVEROUTPUT ON
DECLARE
payment_num                       NUMBER(2) := 0;
d_loop_count                      NUMBER(2) := 24;
payment_amt                       NUMBER(8, 2);
donation_balance                  NUMBER(8,2);
v_pledgeamt                       NUMBER(8,2);
start_date                        DATE :=  '01-OCT-2012';
due_date                          DATE;
v_due_date                        VARCHAR2(15);

BEGIN

 SELECT pledgeamt  INTO v_pledgeamt    FROM dd_pledge
    WHERE idpledge = &idpledge;

payment_amt := v_pledgeamt / d_loop_count;
due_date := start_date;
donation_balance := (v_pledgeamt - payment_amt);

FOR i IN 1..d_loop_count
LOOP
payment_num :=payment_num + 1;
v_due_date := TO_CHAR(due_date,'mm/dd/yyyy');
due_date := add_months(due_date, 1);
dbms_output.put_line
(
'Pay #: ' || payment_num
|| ' ' || 'Due: ' || v_due_date
|| ' ' ||  'Amt: ' || payment_amt
|| ' ' || 'Bal: '|| to_char(donation_balance, '$9999.99')
);

donation_balance := (donation_balance - payment_amt);

END LOOP;

END;
/
于 2013-02-21T22:21:13.140 に答える
0

これは、既存の Oracle emp テーブルに基づく例です。申し訳ありませんが、コードを掘り下げる時間がなく、サンプル データを投稿していません。質問を投稿するときは、必ず表とデータを作成してください。さらに、PL/SQL を学習している場合を除き、可能な限り SQL を使用することは tbone に同意します。コピーして貼り付けて結果を表示します。コードのようにループ内で SELECT... INTO を使用しないでください。

DECLARE
  CURSOR c1 IS SELECT * FROM scott.emp;
  TYPE EmpTabTyp IS TABLE OF scott.emp%ROWTYPE INDEX BY BINARY_INTEGER;
  emp_tab  EmpTabTyp;
  i        BINARY_INTEGER := 0;
BEGIN
  OPEN c1;
  LOOP
     i := i + 1;
     FETCH c1 INTO emp_tab(i);
     EXIT WHEN c1%NOTFOUND;
    --dbms_output.put_line(emp_tab(i).empno);
  END LOOP;
 CLOSE c1;
END;
/

DECLARE
  TYPE EmpTabTyp IS TABLE OF scott.emp%ROWTYPE INDEX BY BINARY_INTEGER;
  emp_tab      EmpTabTyp;
  i            BINARY_INTEGER := 0;
  CURSOR c1 IS SELECT * FROM scott.emp;
BEGIN
-- Method 1 - the BULK COLLECT is faster --
  SELECT * BULK COLLECT INTO emp_tab FROM scott.emp;

  dbms_output.put_line('BULK example:'||chr(13));

  -- Display values in emp_tab --
  --FOR i IN emp_tab.first .. emp_tab.last LOOP  -- or use COUNT method as below --
  FOR i IN 1 .. emp_tab.COUNT LOOP
    dbms_output.put_line(i||' '||emp_tab(i).empno||' '||emp_tab(i).ename);
 END LOOP;

 dbms_output.put_line(chr(13)||'END BULK example'||chr(13));

 -- Method 2 - Loop --
 FOR e_rec IN c1 LOOP
   i:= i+1;
    emp_tab(i).empno:= e_rec.empno;
    dbms_output.put_line(i||' '||emp_tab(i).empno);
 END LOOP;
END;
/
于 2013-02-20T18:19:49.947 に答える