Как я могу обновить valor_total для каждого fatura_id, используя сумму выше - PullRequest
0 голосов
/ 24 января 2020
CREATE OR REPLACE PROCEDURE ATUALIZARVALORTOTAL (ANO NUMBER, MES NUMBER) as;  
BEGIN
    UPDATE FATURA
        SET VALOR_TOTAL = (SELECT SUM(DETALHE_FATURA.VALOR) 
                            FROM DETALHE_FATURA, FATURA
                            WHERE DETALHE_FATURA.ID_FATURA = FATURA.ID_FATURA AND 
                            EXTRACT (YEAR FROM FATURA.DATA_EMISSAO) = ANO AND 
                            EXTRACT (MONTH FROM FATURA.DATA_EMISSAO) = MES
                            GROUP BY DETALHE_FATURA.ID_FATURA, DETALHE_FATURA.ID_FATURA)
                            ;           
END;

- ТЕСТ

BEGIN
    ATUALIZARVALORTOTAL(2019, 10);
END;

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Было бы полезно получить сообщение об ошибке, но в любом случае я не думаю, что эта процедура будет делать то, что вы хотите. Вам нужно предложение where для обновления, или оно будет обновлять каждую строку в таблице.

UPDATE FATURA
        SET VALOR_TOTAL = (SELECT SUM(DETALHE_FATURA.VALOR) 
                            FROM DETALHE_FATURA, FATURA
                            WHERE DETALHE_FATURA.ID_FATURA = FATURA.ID_FATURA AND 
                            EXTRACT (YEAR FROM FATURA.DATA_EMISSAO) = ANO AND 
                            EXTRACT (MONTH FROM FATURA.DATA_EMISSAO) = MES
                            GROUP BY DETALHE_FATURA.ID_FATURA)                           
where EXTRACT( YEAR FROM FATURA.DATA_EMISSAO) = ANO and
       EXTRACT(MONTH FROM FATURA.DATA_EMISSAO) = MES;       
0 голосов
/ 24 января 2020

Вы можете использовать для него оператор MERGE следующим образом:

CREATE OR REPLACE PROCEDURE ATUALIZARVALORTOTAL (
    ANO NUMBER,
    MES NUMBER
) AS
BEGIN
    MERGE INTO FATURA TRG USING (
                                    SELECT
                                        DETALHE_FATURA.ID_FATURA,
                                        SUM(DETALHE_FATURA.VALOR) AS VALOR
                                    FROM
                                        DETALHE_FATURA
                                        JOIN FATURA 
                                        ON ( DETALHE_FATURA.ID_FATURA = FATURA.ID_FATURA )
                                    WHERE
                                        EXTRACT(YEAR FROM FATURA.DATA_EMISSAO) = ANO
                                        AND EXTRACT(MONTH FROM FATURA.DATA_EMISSAO) = MES
                                    GROUP BY
                                        DETALHE_FATURA.ID_FATURA
                                )
    SRC ON ( TRG.ID_FATURA = SRC.ID_FATURA )
    WHEN MATCHED THEN UPDATE SET TRG.VALOR_TOTAL = SRC.VALOR;

END;

Также попробуйте использовать стандартные соединения ANSI .

Ура !!

...