在 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>
我正在尝试制作一个简单的触发器,在付款时更新客户余额。错误显示在 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>