Sql 插入后触发器上的突变错误

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

我试图在用户插入一行后计算一些列。 使用服务请求id,我想计算服务/零件/总成本。另外,我想生成创建和到期日期。但是,我一直在

发票正在变化,触发器/函数可能看不到它

不确定insert语句之后该表是如何变化的

不确定insert语句之后该表是如何变化的

想象一个简单的表格:

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 |
...
...