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;