在 SQL 触发器中使用更新的值

Using updated values in a SQL trigger

我正在尝试制作一个简单的触发器,在付款时更新客户余额。错误显示在 begin 语句之后。我正在尝试在 where 语句中使用新插入的 customerID 并再次向下几行来计算新的余额。有人可以用正确的语法帮助我吗?表格在底部。

--Whenever a payment is made, customer amount owed is adjusted
create or replace trigger paymentUpdate
after insert on payment
for each row
when (new.transactionID > 0)

declare
newAmount decimal(7,2);
currentBalance decimal(7,2);

begin
--Get the outstanding customer balance
select amountOwed into currentBalance
from customer
where customer.customerID=:new.customerID; --Does this do what I think it does?
-- ^^is any of this needed?

--Subtracts the recently made payment from the customer balance
newAmount := currentBalance - :new.amount;

--Update customer amount owed
update customer.amountOwed
set amountOwed = newAmount
where customer.customerID=:new.customerID;
dbms_output.put_line('Original account balance was: '||currentBalance);
dbms_output.put_line('Payment made was: $'||:new.amount); --Check this
dbms_output.put_line('Customer account balance is now: '||newAmount);

end paymentUpdate;
/
--commit needed?

表格:

INSERT INTO customer (customerID, name, address, insurance, contactInfo, customerType, licenseNumber, amountOwed)
VALUES (45124512, 'Bob Jones',  '232 Sycamore Ln.', 'Pekin', 3095555145, 'New', 'SSSSFFFYYDDD', 220.00);
INSERT INTO customer (customerID, name, address, insurance, contactinfo, customertype, licensenumber, amountOwed)
VALUES (12892222, 'Mike Tyson','100 Haters Rd.', 'Progressive', 2175555555, 'Regular', 'FGHJHHHHTYYY', 42.00);

INSERT INTO payment (customerID, transactionID, amount, method, payDate)
VALUES (45124512, 56785678, 220.00, 'Credit Card', '25-JUN-15');    
INSERT INTO payment (customerID, transactionID, amount, method, payDate)
VALUES (12892222, 68689000, 42.00, 'Cash', '25-JUN-15');

错误: 7/1 PL/SQL:SQL 声明被忽略 9/6 PL/SQL: ORA-00942 table 或视图不存在 16/1 PL/SQL:SQL 语句被忽略 16/17 PL/SQL: ORA-00942 table 或视图不存在

触发器块的创建,另一个小变化,在更新语句中它只是 table 名称,而不是 tablename.column 名称

SQL> create or replace trigger paymentUpdate
  2  after insert on payment
  3  for each row
  4  when (new.transactionID > 0)
  5
  6  declare
  7  newAmount decimal(7,2);
  8  currentBalance decimal(7,2);
  9
 10  begin
 11  --Get the outstanding customer balance
 12  select amountOwed into currentBalance
 13  from customer
 14  where customerID=:new.customerID;
 15
 16
 17  newAmount := currentBalance - :new.amount;
 18
 19
 20  update customer   -- corrected from your code
 21  set amountOwed = newAmount
 22  where customerID=:new.customerID;
 23  dbms_output.put_line('Original account balance was: '||currentBalance);
 24  dbms_output.put_line('Payment made was: $'||:new.amount); --Check this
 25  dbms_output.put_line('Customer account balance is now: '||newAmount);
 26
 27  end paymentUpdate;
 28  /

Trigger created.

插入新付款前的初始数据

SQL> select  * from payment;

CUSTOMERID TRANSACTIONID     AMOUNT METHOD               PAYDATE
---------- ------------- ---------- -------------------- ---------
  45124512      56785678        220 Credit Card          25-JUN-15
  12892222      68689000         42 Cash                 25-JUN-15

SQL> select * from customer;

CUSTOMERID NAME                 ADDRESS                                  INSURANCE            CONTACTINFO CUSTOMERTYPE         LICENSENUMBER        AMOUNTOWED
---------- -------------------- ---------------------------------------- -------------------- ----------- -------------------- -------------------- ----------
  45124512 Bob Jones            232 Sycamore Ln.                         Pekin                 3095555145 New                  SSSSFFFYYDDD                220
  12892222 Mike Tyson           100 Haters Rd.                           Progressive           2175555555 Regular              FGHJHHHHTYYY                 42

为客户插入新付款并触发触发器后。

SQL> INSERT INTO payment (customerID, transactionID, amount, method, payDate)
  2  VALUES (45124512, 56785679, 50, 'Credit Card', '26-JUN-15');
Original account balance was: 220
Payment made was: 
Customer account balance is now: 170

1 row created.

现在欠款已经按触发减少了,之前是220,付了50后,欠款是170。

SQL> select * from customer;

CUSTOMERID NAME                 ADDRESS                                  INSURANCE            CONTACTINFO CUSTOMERTYPE         LICENSENUMBER        AMOUNTOWED
---------- -------------------- ---------------------------------------- -------------------- ----------- -------------------- -------------------- ----------
  45124512 Bob Jones            232 Sycamore Ln.                         Pekin                 3095555145 New                  SSSSFFFYYDDD                170
  12892222 Mike Tyson           100 Haters Rd.                           Progressive           2175555555 Regular              FGHJHHHHTYYY                 42

SQL>