Well, I have a table called LOCALAOBOOK in it I have BOOK and CUSTOMER information when an insert or update of allocation occurs, so the customer_id, id_id, the output_data will be informed and from this date the delivery_date_date will be generated, which will add 7 days to the date I created a table named alocacao_livro, a trigger and a cursor follow the codes below.From already myth grate!
-- TABELA LIVRO
CREATE TABLE LIVRO(
ID_LIVRO SERIAL NOT NULL PRIMARY KEY,
ISBN INTEGER NOT NULL UNIQUE,
NOME VARCHAR(255) NOT NULL,
AUTOR VARCHAR(255) NOT NULL,
EDITORA VARCHAR(255) NOT NULL,
ANO_PUBLICACAO INTEGER NOT NULL);
-- TABELA CLIENTE
CREATE TABLE CLIENTE(
ID_CLIENTE SERIAL NOT NULL PRIMARY KEY,
MATRICULA INTEGER NOT NULL UNIQUE,
NOME VARCHAR(255) NOT NULL,
TELEFONE VARCHAR(15) NOT NULL);
-- TABELA ALOCAÇÃO_LIVRO
CREATE TABLE LOCACAO_LIVRO(
ID_LOCACAO SERIAL NOT NULL PRIMARY KEY,
ID_CLIENTE INTEGER NOT NULL REFERENCES CLIENTE,
ID_LIVRO INTEGER NOT NULL REFERENCES LIVRO,
DT_SAIDA DATE,
DT_PREVISAO_ENTREGA DATE,
DT_ENTREGA DATE);
MY TRIGGER
CREATE TRIGGER TR_AF_CONTROLA_DT_PREVISAO_ENTREGA_LIVRO_TB_LOCACAO_LIVRO
AFTER INSERT OR UPDATE ON LOCACAO_LIVRO
FOR EACH ROW
EXECUTE PROCEDURE FN_GERAR_DT_PREVISAO_ENTREGA_LIVRO();
MY FUNCTION (CURSOR)
CREATE OR REPLACE FUNCTION FN_GERAR_DT_PREVISAO_ENTREGA_LIVRO()
RETURNS TRIGGER AS
$$
DECLARE
VAR_ID_LOCACAO INTEGER;
VAR_ID_CLIENTE INTEGER;
VAR_ID_LIVRO INTEGER;
VAR_DT_SAIDA DATE;
VAR_DT_PREVISAO_ENTREGA DATE;
CURSOR_INSERE_DT_PREVISTA_ENTREGA CURSOR FOR SELECT
ID_LOCACAO, ID_CLIENTE, ID_LIVRO, DT_SAIDA, DT_PREVISAO_ENTREGA
FROM LOCACAO_LIVRO
WHERE ID_LOCACAO IS NOT NULL;
BEGIN
OPEN CURSOR_INSERE_DT_PREVISTA_ENTREGA;
FETCH CURSOR_INSERE_DT_PREVISTA_ENTREGA INTO VAR_ID_LOCACAO, VAR_ID_CLIENTE, VAR_ID_LIVRO, VAR_DT_SAIDA, VAR_DT_PREVISAO_ENTREGA;
WHILE FOUND LOOP
VAR_DT_PREVISAO_ENTREGA = VAR_DT_SAIDA + 7;
IF(VAR_ID_LOCACAO IS NOT NULL)THEN
UPDATE LOCACAO_LIVRO
SET DT_SAIDA = VAR_DT_SAIDA, DT_PREVISAO_ENTREGA = VAR_DT_PREVISAO_ENTREGA
WHERE ID_LOCACAO = VAR_ID_LOCACAO
AND ID_CLIENTE = VAR_ID_CLIENTE
AND ID_LIVRO = VAR_ID_LIVRO;
END IF;
FETCH CURSOR_INSERE_DT_PREVISTA_ENTREGA INTO VAR_ID_LOCACAO, VAR_ID_CLIENTE, VAR_ID_LIVRO, VAR_DT_SAIDA, VAR_DT_PREVISAO_ENTREGA;
END LOOP;
CLOSE CURSOR_INSERE_DT_PREVISTA_ENTREGA;
RETURN NEW;
END;
$$
LANGUAGE PLPGSQL;