Oracle 更新列

Oracle 更新列,oracle,oracle10g,Oracle,Oracle10g,我创建了一个具有以下属性的表: TABLE "VENDORACCOUNT" ( "VEN_ACCOUNTID" "VEN_REGNO" "VEN_TXDATE" "VEN_INVOICE_REFNO" "TOTALAMOUNT" "PAID_TOVEN" "BALANCE" ) 我根据另一个表的发票参考号值,通过弹出的LOV从另一个表中获取总金额列值。这里的场景是从PAID\u TOVEN列值中减去TOTALAMOUNT列值。但下次

我创建了一个具有以下属性的表:

 TABLE "VENDORACCOUNT" 

 (  "VEN_ACCOUNTID" 
    "VEN_REGNO" 
    "VEN_TXDATE"
    "VEN_INVOICE_REFNO"
    "TOTALAMOUNT"
    "PAID_TOVEN"
    "BALANCE"
)
我根据另一个表的
发票参考号
值,通过弹出的LOV从另一个表中获取
总金额
列值。这里的场景是从
PAID\u TOVEN
列值中减去
TOTALAMOUNT
列值。但下次我选择
TOTALAMOUNT
值时,它不会显示更新后的值。它向我显示了旧值,如下面的报告所示

查询报告:

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

在上面的报告中,我希望每当我进行第二次输入时,它应该分别显示减去的或更新的值,即
1800
而不是
2800
4550
而不是
9550
。所以下次我可以从
1800
4550
中减去金额


我创造了这个触发器

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” 以下选项之一:开始函数pragma过程子类型类型类型current curs'


我想你不需要扳机。您可以根据下面的查询创建一个视图,然后根据
视图
为您的LOV创建记录组。这个查询看起来像-

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);

查询基本上满足了您的要求,但是您的示例数据看起来不正确。这实际上是一个运行总数的示例。

在上面的查询中,您是自己输入数据的吗?我将在表单中输入数据或让我知道。我还有触发器,你能为我修改它吗。因此我猜你没有阅读我提到的部分
,因此根据你的表,查询将是…
我阅读了它。。我理解这个问题,但我不理解第二部分的细节。我应该使用它还是为了理解?顺便说一下,你的输出是错误的。看看你的输出。如果你从1800减去2000,i-e 1800-2000=-200,你的结果是800Buddy,我给你一个如何着手解决这个问题的想法。你不希望我做你的家庭作业或完成你的项目,对吗?因为如果你是,那么你在错误的地方。