CREATE OR REPLACE TRIGGER T_GERA_ENDERECO_AFTER AFTER INSERT ON pessoa
DECLARE
-- cria o tipo para variável que armazena o conteúdo do package
TYPE tbPessoaPackage IS TABLE OF pessoa%ROWTYPE INDEX BY BINARY_INTEGER;
tbPessoa tbPessoaPackage;
x BINARY_INTEGER; --indice
BEGIN
-- atribui ao índice o primeiro valor do package
x := pkg_pessoa.vPessoa.FIRST;
-- limpa a var criada
tbPessoa.DELETE;
-- adiciona todos os registros do package na variável criada
WHILE x IS NOT NULL LOOP
tbPessoa(x).id_pessoa := pkg_pessoa.vPessoa(x).id_pessoa;
tbPessoa(x).nome_pessoa := pkg_pessoa.vPessoa.nome_pessoa;
tbPessoa(x).id_endereco := pkg_pessoa.vPessoa.id_endereco;
x := pkg_pessoa.vPessoa.NEXT(x); -- incrementa o valor do índice
END LOOP;
pkg_pessoa.vPessoa.DELETE; -- limpa o package
x := tbPessoa.FIRST; -- atribui ao índice o primeiro valor
-- loop para percorrer todos os registros do package
WHILE x IS NOT NULL LOOP
-- insert na tabela endereco, com o nome da rua sendo Rua + nome da pessoa (ex: Rua do Felisberto)
BEGIN
INSERT INTO endereco (id_endereco,lograddouro) values (seq_endereco.nextval, 'Rua do ' || tbPessoa(x).nome_pessoa);
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001
,'Não foi possível inserir os dados na tabela ENDERECO. Trigger: T_GERA_ENDERECO_AFTER ' || SQLERRM);
END;
-- update na tabela Pessoa, para setar o valor do id_endereco da Pessoa com o valor do id do endereço gerado no insert acima
BEGIN
UPDATE pessoa p SET p.id_endereco = seq_endereco.currval
WHERE p.id_pessoa = tbPessoa(x).id_pessoa;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20002
,'Não foi possível atualizar os dados na tabela PESSOA. Trigger:
T_GERA_ENDERECO_AFTER ' || SQLERRM);
END;
-- atualiza valor do indice para o proximo registro
x := tbPessoa.NEXT(x);
END LOOP;
Pergunta
Orlando cawende
CREATE OR REPLACE TRIGGER T_GERA_ENDERECO_AFTER AFTER INSERT ON pessoa
DECLARE
-- cria o tipo para variável que armazena o conteúdo do package
TYPE tbPessoaPackage IS TABLE OF pessoa%ROWTYPE INDEX BY BINARY_INTEGER;
tbPessoa tbPessoaPackage;
x BINARY_INTEGER; --indice
BEGIN
-- atribui ao índice o primeiro valor do package
x := pkg_pessoa.vPessoa.FIRST;
-- limpa a var criada
tbPessoa.DELETE;
-- adiciona todos os registros do package na variável criada
WHILE x IS NOT NULL LOOP
tbPessoa(x).id_pessoa := pkg_pessoa.vPessoa(x).id_pessoa;
tbPessoa(x).nome_pessoa := pkg_pessoa.vPessoa.nome_pessoa;
tbPessoa(x).id_endereco := pkg_pessoa.vPessoa.id_endereco;
x := pkg_pessoa.vPessoa.NEXT(x); -- incrementa o valor do índice
END LOOP;
pkg_pessoa.vPessoa.DELETE; -- limpa o package
x := tbPessoa.FIRST; -- atribui ao índice o primeiro valor
-- loop para percorrer todos os registros do package
WHILE x IS NOT NULL LOOP
-- insert na tabela endereco, com o nome da rua sendo Rua + nome da pessoa (ex: Rua do Felisberto)
BEGIN
INSERT INTO endereco (id_endereco,lograddouro) values (seq_endereco.nextval, 'Rua do ' || tbPessoa(x).nome_pessoa);
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001
,'Não foi possível inserir os dados na tabela ENDERECO. Trigger: T_GERA_ENDERECO_AFTER ' || SQLERRM);
END;
-- update na tabela Pessoa, para setar o valor do id_endereco da Pessoa com o valor do id do endereço gerado no insert acima
BEGIN
UPDATE pessoa p SET p.id_endereco = seq_endereco.currval
WHERE p.id_pessoa = tbPessoa(x).id_pessoa;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20002
,'Não foi possível atualizar os dados na tabela PESSOA. Trigger:
T_GERA_ENDERECO_AFTER ' || SQLERRM);
END;
-- atualiza valor do indice para o proximo registro
x := tbPessoa.NEXT(x);
END LOOP;
END;
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.