0

次の属性を持つテーブルを作成しました。

 TABLE "VENDORACCOUNT" 

 (  "VEN_ACCOUNTID" 
    "VEN_REGNO" 
    "VEN_TXDATE"
    "VEN_INVOICE_REFNO"
    "TOTALAMOUNT"
    "PAID_TOVEN"
    "BALANCE"
)

その値に基づいて、別のテーブルからTOTALAMOUNT列の値を取得します。ここでのシナリオは、列の値が列の値から減算されるというものです。しかし、次に値を選択すると、更新された値が表示されません。以下のレポートに示すように、古い値が表示されます。 POPUP LOVVEN_INVOICE_REFNOTOTALAMOUNTPAID_TOVENTOTALAMOUNT

レポートのクエリ:

select "VEN_ACCOUNTID",
      "VEN_REGNO" ,
      "VEN_TXDATE" ,
      "VEN_INVOICE_REFNO" as ,
      "TOTALAMOUNT" as ,
      "PAID_TOVEN" as ,
       TOTALAMOUNT-PAID_TOVEN as "Balance"
 from    "VENDORACCOUNT" 

レポートのスクリーンショット

上記のレポートでは、2 番目のエントリを実行するたびに、減算または更新された値が表示されるようにしたいと考えてい1800ます。次回はとから金額を引くことができます。28004550955018004550


このトリガーを作成しました

create or replace trigger "VENDORACCOUNT_T2"
BEFORE
insert or update or delete on "VENDORACCOUNT"
for each row
begin
DECLARE new_balance INT; 
DECLARE new_total INT;
DECLARE new_paid INT;

   SELECT balance INTO old_balance,
   total INTO old_total,
       PAID_TOVEN INTO new_paid
   FROM vendoraccount
   WHERE ven_regno = new.ven_regno
   AND VEN_INVOICE_REFNO = new.VEN_INVOICE_REFNO;

   UPDATE vendoraccount SET TOTALAMOUNT = old_total + old_balance - new_paid,
   balance = TOTALAMOUNT - new_paid
   WHERE VEN_REGNO= new.VEN_REGNO
   AND VEN_INVOICE_REFNO = new.VEN_INVOICE_REFNO;

end;

そして、このエラーが発生しています:

エラー: PLS-00103: 「次のいずれかを期待しているときに、シンボル「DECLARE」が見つかりました: begin function pragma procedure subtype type current curs'

4

1 に答える 1

1

トリガーはいらないと思います。以下のクエリに基づいてビューを作成し、VIEW. クエリは次のようになります-

select accid,regno,inv_refno,LAG(bal,1,totalamount) OVER (PARTITION BY regno ORDER BY accid) "TOTALAMOUNT", paid_toven, bal
from (with temp_data as
       (select 2 accid,3 regno, 16 inv_refno, 2800 totalamount, 1000 paid_toven from dual
         union
        select 3 accid,3 regno, 16 inv_refno, 2800 totalamount, 2000 paid_toven from dual
         union
        select 4 accid,8 regno, 22 inv_refno, 9550 totalamount, 5000 paid_toven from dual
         union
        select 5 accid,8 regno, 22 inv_refno, 9550 totalamount, 5000 paid_toven from dual
         union
        select 6 accid,8 regno, 22 inv_refno, 9550 totalamount, 8000 paid_toven from dual)
      select accid,regno,inv_refno,totalamount,paid_toven,totalamount-paid_toven bal       
      from temp_data);

出力は -

ACCID REGNO INV_REFNO TOTALAMOUNT PAID_TOVEN BAL
----- ----- --------- ----------- ---------- ---
    2     3        16        2800       1000 1800 
    3     3        16        1800       2000 800 
    4     8        22        9550       5000 4550 
    5     8        22        4550       5000 4550 
    6     8        22        4550       8000 1550 

したがって、テーブルに基づいて、クエリは次のようになります-

select accid,regno,inv_refno,LAG(bal,1,totalamount) OVER (PARTITION BY regno ORDER BY accid) "TOTALAMOUNT", paid_toven, bal
    from (select accid,regno,inv_refno,totalamount,paid_toven,totalamount-paid_toven bal       
          from VENDORACCOUNT);

クエリは目的のほとんどを実行しますが、サンプル データは正しくありません。これは、実際には実行中の合計の 1 つの例です。

于 2012-12-06T15:44:18.353 に答える