-1
Well, I have a table called LOCACAO_LIVRO in it I have BOOK and CLIENT information when an allocation update occurs then the id_client will be informed, id_book, the data_de_output and from this date will be generated the data_de_previssao_delivery that will add 7 days to the date of departure, for this I created a table called alocaca_book, a Trigger and a cursor follow the codes below.Already grateful myth!
-- 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;
Edit your answer put the codes correctly and explain what is happening, why until then you have presented tables and your Rigger, but not explained what the problem is.
– Nelson Aguiar
Good evening Nelson, this is the error that occurs every time I try to insert an allocation in the table allocation_book cursor "cursor_inse_dt_prevista_delivery" already in use CONTEXT: PL/pgsql Function fn_gerar_dt_previsao_book() line 13 at OPEN SQL statement "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" PL/pgsql Function fn_gerar_dt_previsao_entrega_book() line 19 at SQL statement ********** Error **********
– Willian Marques