TRIGGER AFTER UPDATE

22/01/2013

2

CREATE TRIGGER "PREENCHE_CAPLIVNOME"

AFTER INSERT ON "CAPITULO" POSITION 0

FOR EACH ROW

declare
cont,vcap number;
vcaplivnome varchar2(100)

begin
select distinct l.livid,livnome,c.capid,caplivro,caplivnome from livro l, capitulo c
where l.livid = c.capid into cont;

if cont < 0 then
update capitulo set caplivnome = vcaplivnome where vcap=vcapliv;

end

DANDO ERRO ORA-04079: especificação de gatilho inválida

Responder

Posts

23/01/2013

Danilo Gomes

CREATE TRIGGER "PREENCHE_CAPLIVNOME"

AFTER INSERT ON "CAPITULO" POSITION 0

FOR EACH ROW

declare
cont,vcap number;
vcaplivnome varchar2(100)

begin
select distinct l.livid,livnome,c.capid,caplivro,caplivnome from livro l, capitulo c
where l.livid = c.capid into cont;

if cont < 0 then
update capitulo set caplivnome = vcaplivnome where vcap=vcapliv;

end


Tente colocar ponto e vírgula no "end" e na declaração de "vcaplivnome":

CREATE TRIGGER "PREENCHE_CAPLIVNOME"

AFTER INSERT ON "CAPITULO" POSITION 0

FOR EACH ROW

declare
cont,vcap number;
vcaplivnome varchar2(100);

begin
select distinct l.livid,livnome,c.capid,caplivro,caplivnome from livro l, capitulo c
where l.livid = c.capid into cont;

if cont < 0 then
update capitulo set caplivnome = vcaplivnome where vcap=vcapliv;

end;

Responder
CREATE TRIGGER "PREENCHE_CAPLIVNOME"

AFTER INSERT ON "CAPITULO" POSITION 0

FOR EACH ROW

declare
cont,vcap number;
vcaplivnome varchar2(100)

begin
select distinct l.livid,livnome,c.capid,caplivro,caplivnome from livro l, capitulo c
where l.livid = c.capid into cont;

if cont < 0 then
update capitulo set caplivnome = vcaplivnome where vcap=vcapliv;

end


Tente colocar ponto e vírgula no "end" e na declaração de "vcaplivnome":

CREATE TRIGGER "PREENCHE_CAPLIVNOME"

AFTER INSERT ON "CAPITULO" POSITION 0

FOR EACH ROW

declare
cont,vcap number;
vcaplivnome varchar2(100);

begin
select distinct l.livid,livnome,c.capid,caplivro,caplivnome from livro l, capitulo c
where l.livid = c.capid into cont;

if cont < 0 then
update capitulo set caplivnome = vcaplivnome where vcap=vcapliv;

end;

NO CODIGO NO ORACLE ESTÁ COM OS PONTOS E VIRGULA E NÃO É ISTO, SE ALGUEM SOUBER SE TRATA DO GATILHO
Responder

23/01/2013

Danilo Gomes

Cara, você está migrando de plataforma?

Tem alguns aspectos aí a serem analisados.

1 - Retire esse "Position 0";
2 - Declare as variáveis separadamente;
3 - E, principalmente, selecione apenas um valor no seu select para a variável number!

Teste aí:


CREATE TRIGGER PREENCHE_CAPLIVNOME AFTER
INSERT ON marca_tipo FOR EACH ROW DECLARE cont NUMBER;
vcap NUMBER;
vcaplivnome VARCHAR2(100);
BEGIN
SELECT
COUNT(DISTINCT l.livid)
INTO
cont
FROM
livro l,
capitulo c
WHERE
l.livid = c.capid;
IF cont < 0 THEN
UPDATE capitulo SET caplivnome = vcaplivnome WHERE vcap=vcapliv;
END IF;
END;
Responder
Realmente estou estudando varias bancos de dados e 'as vezes confundo as coisas
criei este banco em oracle 10 g a partir de um escript que criei no sqlserver depois firebir:
reformulei mas não testei ainda acredito que tenha erros ainda

TODA VES QUE INSERIR EM CAPITULO
VERIFICAR CAPLIVRO = LIVID
SE FOR IGUAL ENTÃO
TEM QUE INSERIR EM CAPITULO,CAPLIVNOME O LIVNOME

Tabelas:

CREATE TABLE "LIVRO"
("LIVID" NUMBER NOT NULL ENABLE,
"LIVNOME" VARCHAR2(40) NOT NULL ENABLE,
"COMENT" VARCHAR2(500),
CONSTRAINT "LIVRO_PK" PRIMARY KEY ("LIVID") ENABLE
)
/

CREATE table "CAPITULO" (
"CAPID" NUMBER NOT NULL,
"CAPLIVRO" NUMBER NOT NULL,
"CAPLIVNOME" VARCHAR2(100)
"CAPNUM" NUMBER,
"COMENT" VARCHAR2(500),
constraint "CAPITULO_PK" primary key ("CAPID")
)
/
ALTER TABLE CAPITULO ADD CAPLIVNOME VARCHAR2(100)
ALTER TABLE CAPITULO ADD CONSTRAINT FK_CAPLIVID FOREIGN KEY (CAPLIVRO) REFERENCES LIVRO (LIVID)



CREATE TRIGGER "PREENCHE_CAPITULO_NOME"
AFTER INSERT ON "CAPITULO" POSITION 0

FOR EACH ROW

declare
vlivnome varchar2(50);
vlivid.vcapitulo number;

begin
select distinct l.livid into vlivid,livnome into vlivnome,c.caplivro into vcapitulo from livro l, capitulo c
where l.livid = c.capid;

if (vcapitulo < 0) then
update capitulo
set caplivnome = vcaplivnome
where vcapliv=vlivid;

endif
end;
Responder

23/01/2013

Danilo Gomes

Para Oracle, o código abaixo já está sem erros:

CREATE TRIGGER PREENCHE_CAPLIVNOME AFTER
INSERT ON marca_tipo FOR EACH ROW DECLARE cont NUMBER;
vcap NUMBER;
vcaplivnome VARCHAR2(100);
BEGIN
SELECT
COUNT(DISTINCT l.livid)
INTO
cont
FROM
livro l,
capitulo c
WHERE
l.livid = c.capid;
IF cont < 0 THEN
UPDATE capitulo SET caplivnome = vcaplivnome WHERE vcap=vcapliv;
END IF;
END;
Responder