TRIGGER AFTER UPDATE
22/01/2013
0
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
Marcelo Augusto
Posts
23/01/2013
Danilo Gomes
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;
23/01/2013
Marcelo Augusto
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
23/01/2013
Danilo Gomes
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;
23/01/2013
Marcelo Augusto
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;
23/01/2013
Danilo Gomes
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;
Clique aqui para fazer login e interagir na Comunidade :)