Sql 插入后触发器上的突变错误
我试图在用户插入一行后计算一些列。 使用服务请求id,我想计算服务/零件/总成本。另外,我想生成创建和到期日期。但是,我一直在 发票正在变化,触发器/函数可能看不到它 不确定insert语句之后该表是如何变化的 不确定insert语句之后该表是如何变化的 想象一个简单的表格:Sql 插入后触发器上的突变错误,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,我试图在用户插入一行后计算一些列。 使用服务请求id,我想计算服务/零件/总成本。另外,我想生成创建和到期日期。但是,我一直在 发票正在变化,触发器/函数可能看不到它 不确定insert语句之后该表是如何变化的 不确定insert语句之后该表是如何变化的 想象一个简单的表格: CREATE OR REPLACE TRIGGER TRG_INVOICE AFTER INSERT ON INVOICE FOR EACH ROW DECLARE V_SERVICE_CO
CREATE OR REPLACE TRIGGER TRG_INVOICE
AFTER INSERT
ON INVOICE
FOR EACH ROW
DECLARE
V_SERVICE_COST FLOAT;
V_SPARE_PART_COST FLOAT;
V_TOTAL_COST FLOAT;
V_INVOICE_DATE DATE;
V_DUEDATE DATE;
V_REQ_ID INVOICE.SERVICE_REQ_ID%TYPE;
V_INV_ID INVOICE.INVOICE_ID%TYPE;
BEGIN
V_REQ_ID := :NEW.SERVICE_REQ_ID;
V_INV_ID := :NEW.INVOICE_ID;
SELECT SUM(S.SERVICE_COST) INTO V_SERVICE_COST
FROM INVOICE I, SERVICE_REQUEST SR, SERVICE S, SERVICE_REQUEST_TYPE SRT
WHERE I.SERVICE_REQ_ID = SR.SERVICE_REQ_ID
AND SR.SERVICE_REQ_ID = SRT.SERVICE_REQ_ID
AND SRT.SERVICE_ID = S.SERVICE_ID
AND I.SERVICE_REQ_ID = V_REQ_ID;
SELECT SUM(SP.PRICE) INTO V_SPARE_PART_COST
FROM INVOICE I, SERVICE_REQUEST SR, SERVICE S, SERVICE_REQUEST_TYPE SRT,
SPARE_PART_SERVICE SRP,
SPARE_PART SP
WHERE I.SERVICE_REQ_ID = SR.SERVICE_REQ_ID
AND SR.SERVICE_REQ_ID = SRT.SERVICE_REQ_ID
AND SRT.SERVICE_ID = S.SERVICE_ID
AND S.SERVICE_ID = SRP.SERVICE_ID
AND SRP.SPARE_PART_ID = SP.SPARE_PART_ID
AND I.SERVICE_REQ_ID = V_REQ_ID;
V_TOTAL_COST := V_SERVICE_COST + V_SPARE_PART_COST;
SELECT SYSDATE INTO V_INVOICE_DATE FROM DUAL;
SELECT ADD_MONTHS(SYSDATE, 1) INTO V_DUEDATE FROM DUAL;
UPDATE INVOICE
SET COST_SERVICE_REQ = V_SERVICE_COST, COST_SPARE_PART =
V_SPARE_PART_COST,
TOTAL_BALANCE = V_TOTAL_COST, PAYMENT_DUEDATE = V_DUEDATE, INVOICE_DATE =
V_INVOICE_DATE
WHERE INVOICE_ID = V_INV_ID;
END;
每个行触发器都有一个AFTER INSERT,与您的类似,它计算表中所有值的总和,并更新my_sum
列。
现在想象一下这个insert语句:
create table x(
x int,
my_sum int
);
或者可能:
| X | MY_SUM |
|---|--------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
...
...
或者可能:
| X | MY_SUM |
|---|--------|
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
...
我试图实现的任务对于每一行都有不同的值。通过使用发票中的FK,我查询了特定发票/服务请求的服务成本总额。我已经阅读了您发送的链接“只有在查询开始之前提交的数据对查询可见。在语句执行开始之后,查询看不到提交的更改。”。据我所知,select和update语句发生在insert之后。因此,这些数据应该是可见的。对于这个问题,您推荐什么解决方法?
| X | MY_SUM |
|---|--------|
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
| 1 | 1000 |
...
| X | MY_SUM |
|---|--------|
| 1 | 4 |
| 1 | 8 |
| 1 | 12 |
| 1 | 16 |
| 1 | 20 |
| 1 | 24 |
| 1 | 28 |
...
...