Inserindo dados de um unico formulario em duas tabelas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Try000
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 23 Set 2010 9:36 am

Estou precisando fazer um formulário com os campos das tabelas pessoa e pessoa _cy. A tabela pessoa _cy é um complemento da tabela pessoa que já veio criada de outro lugar.
Minha dificuldade e gravar esses dados Inserir os dados na tabela pessoa e pessoa _cy ao mesmo tempo , O código (NRSEQPESSOA ) assim que gerado tem que ser armazenado no id_pessoa ,da tabela pessoa_cy.
[/b]
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

faz uma trigger em pessoa insderindo em pessoa _cy :!:
Try000
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 23 Set 2010 9:36 am

o problema e que tenho que pegar o Codigo (NRSEQPESSOA )criado na tabela pessoa e passar para id_pessoa da tabela pessoa_cy porque a tabela pessoa_cy e um complemento da tabela pessoa por isso o codigo não pode ser diferente.
tentei usar SELECT MAX mais não funciona e da erro como tempo.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

posta suas tabelas (estrutura) ai..

ao boa prática diz que devemos usar sequence para controlar o id de uma tabela..

esse problema q você ta levantando e facil de recolver basta usar a variavel :NEW dentro da trigger e você tera o id que devera ser inserido na tabela pessoa_cy
Try000
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 23 Set 2010 9:36 am

Fiz esse codigo aqui mais já mudei tanto que to ate confuso estou iniciando e sei muito pouco ainda criei essa PROCEDURE

Selecionar tudo

 




CREATE OR REPLACE PROCEDURE pessoa_upsert(
			p_NRSEQPESSOA		IN  NUMBER(12,0)
			p_NRSEQEMPRESA	IN  NUMBER(12,0)
			p_CDSITUACAO		IN  VARCHAR2(8)
			p_TPPESSOA		IN  VARCHAR2(8)
			p_TXNOME		        IN  VARCHAR2(60)	
			p_AORECEBER		IN  VARCHAR2(3)	
			p_AOPAGAR		IN  VARCHAR2(3)	
			p_TXLOGRADOURO		IN  VARCHAR2(60)
			p_TXNUMERO		IN  VARCHAR2(10)	
			p_TXCIDADE		IN  VARCHAR2(30)	
			p_TXESTADO		IN  VARCHAR2(20)	
			p_TXCOMPLEMENTOENDERECO	IN  VARCHAR2(30)	
			p_NRCEP	         	IN  VARCHAR2(20)	
			p_TXTELEFONE		IN  VARCHAR2(15)	
			p_TXEMAIL		        IN  VARCHAR2(50)	
			p_DTCLIENTEDESDE	IN  DATE	
			p_TXPAIS		        IN  VARCHAR2(30)	
			p_NRDOCUMENTO	IN  VARCHAR2(30)
       

)
IS
BEGIN
    UPDATE pessoa
      SET NRSEQPESSOA	=   p_NRSEQPESSOA,		
	  NRSEQEMPRESA	        =   p_NRSEQEMPRESA,	
          CDSITUACAO		=   p_CDSITUACAO,
	  TPPESSOA		=   p_TPPESSOA,	
	  TXNOME		        =   p_TXNOME,		
	  AORECEBER		=   p_AORECEBER,
	  AOPAGAR		        =   p_AOPAGAR,
	  TXLOGRADOURO	=   p_TXLOGRADOURO,	
	  TXNUMERO		=   p_TXNUMERO,	
   	  TXCIDADE		=   p_TXCIDADE,	
	  TXESTADO		=   p_TXESTADO,	
	  TXCOMPLEMENTOENDERECO =   p_TXCOMPLEMENTOENDERECO,	
  	  NRCEP		        =   p_NRCEP,		
	  TXTELEFONE		=   p_TXTELEFONE,
	  TXEMAIL		        =   p_TXEMAIL,		
   	  DTCLIENTEDESDE	=   p_DTCLIENTEDESDE,	
   	  TXPAIS		        =   p_TXPAIS,	
   	  NRDOCUMENTO		=   p_NRDOCUMENTO	
        WHERE nrseqpessoa    =   p_nrseqpessoa;
   
    UPDATE pessoa_cyber
      SET  ID_PESSOA                   =  p_ID_PESSOA
	   ID_UNIDADE_CADASTRO   =  p_ID_UNIDADE_CADASTRO	
	   ID_CARGO                      =  p_ID_CARGO	
	   DT_CADASTRO                =  p_DT_CADASTRO
	   DT_NASCIMENTO             =  p_DT_NASCIMENTO	
	   TXSEXO                          =  p_TXSEXO	
	   NRCELULAR                    =  p_NRCELULAR
	   NRNIVEL_ESCOLARIDADE  =  p_NRNIVEL_ESCOLARIDADE
	   TXESCOLA                      =  p_TXESCOLA	
	   TXOBS                           =  p_TXOBS

         WHERE ID_PESSOA            =  p_ID_PESSOA;

    IF SQL%NOTFOUND THEN
     
INSERT INTO pessoa( NRSEQPESSOA,		
		    NRSEQEMPRESA,		
		    CDSITUACAO,		
		    TPPESSOA,		
		    TXNOME,		
		    AORECEBER,		
		    AOPAGAR,		
		    TXLOGRADOURO,		
		    TXNUMERO,			
		    TXCIDADE,			
		    TXESTADO,			
		    TXCOMPLEMENTOENDERECO,		
		    NRCEP,	         		
		    TXTELEFONE,			
		    TXEMAIL,			
		    DTCLIENTEDESDE,		
		    TXPAIS,			
		    NRDOCUMENTO
)
VALUES(p_nrseqpessoa,
       p_cdsituacao,
       p_tppessoa,
       p_txnome,
       p_aoreceber,
       p_aopagar,
       p_txlogradouro,
       p_txnumero,
       p_txcomplementoendereco,
       p_nrcep,
       p_txcidade,
       p_txestado,
       p_txtelefone,
       p_txemail,
       p_dtclientedesde,
       p_txpais,
       p_nrdocumento);

  IF ID_PESSOA IS NULL THEN
  INSERT INTO pessoa_cyber (id_pessoa)
            values (p_nrseqpessoa);
  END IF;
  IF P_NM_FANTASIA IS NULL THEN
     RAISE_APPLICATION_ERROR(-20001,'VALOR INVÁLIDO ');
  END IF;
           
INSERT INTO pessoa_cyber(ID_PESSOA,	
			 ID_UNIDADE_CADASTRO,	
			 ID_CARGO,	
			 DT_CADASTRO,	
			 DT_NASCIMENTO,	
			 TXSEXO,
			 NRCELULAR,
			 NRNIVEL_ESCOLARIDADE,
			 TXESCOLA,	
			 TXOBS)
VALUES (ID_PESSOA,	
	ID_UNIDADE_CADASTRO,	
	ID_CARGO,	
	DT_CADASTRO,	
	DT_NASCIMENTO,	
	TXSEXO,
	NRCELULAR,
	NRNIVEL_ESCOLARIDADE,
	TXESCOLA,	
	TXOBS);


    END IF;

 EXCEPTION
          WHEN OTHERS THEN
          RAISE_APPLICATION_ERROR(-20001,' ACONTECU UM PROBLEMA AO INSERIR CLIENTE NA TABELA LOC_CLIENTE');
        END;






ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

maicon,

esse tipo de controle tu pode fazer via a interface que você irá usar para a entrada dos dados, não precisa reinventar a roda, se for via form da Oracle, ele já faz isso para você, não precisa fazer esse controle na mão, basta criar um bloco master-detalhe, mas claro um trigger tambem resolveria teu caso, só que fica meio ingessado também por causa dos demais campos da pessoa_cyber, masssss é só uma dica, segue um exemplo de trigger,

Selecionar tudo

CREATE OR REPLACE TRIGGER nome_da_trigger
AFTER INSERT OR UPDATE OR DELETE ON pessoa
FOR EACH ROW                    
--
DECLARE
  --
  id_unidade_cadastro    pessoa_cyber%id_unidade_cadastro  ;
  id_cargo               pessoa_cyber%id_cargo             ;
  dt_cadastro            pessoa_cyber%dt_cadastro          ;
  dt_nascimento          pessoa_cyber%dt_nascimento        ;
  txsexo                 pessoa_cyber%txsexo               ;
  nrcelular              pessoa_cyber%nrcelular            ;
  nrnivel_escolaridade   pessoa_cyber%nrnivel_escolaridade ;
  txescola               pessoa_cyber%txescola             ;
  txobs                  pessoa_cyber%txobs                ;
BEGIN
  --
  IF INSERTING THEN
    --Código do Insert
    INSERT INTO pessoa_cyber( id_pessoa
                            , id_unidade_cadastro
                            , id_cargo
                            , dt_cadastro
                            , dt_nascimento
                            , txsexo
                            , nrcelular
                            , nrnivel_escolaridade
                            , txescola
                            , txobs) 
                      VALUES( :NEW.id_pessoa
                            , id_unidade_cadastro
                            , id_cargo
                            , dt_cadastro
                            , dt_nascimento
                            , txsexo
                            , nrcelular
                            , nrnivel_escolaridade
                            , txescola
                            , txobs); 
  --                   
  ELSIF UPDATING THEN
    --Codigo do Update
    NULL;
    --
  ELSIF DELETING THEN
    --Codigo do Delete
    --Considerando que não foi feito ON DELETE CASCADE na criação da tabela pessoa_cyber e não tenha chave com pessoa.
    NULL;
    --
  END IF;
  --
END;
/



vlw,
qualquer coisa posta ai,
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

É cara se um registro da tabela pessoa tiver varios da pessoa_cy é melhor usar um bloco mestre detalhe, que ele vai fazer todos controles que tu precisar.

Podes fazer isto via trigger do forms também, pois ao criar um trigger no banco tu tem que ter muito cuidado para não inserir registros em situações indesejadas, se for algo mais específico te sugiro que faça no forms mesmo.

Qualquer duvida de qual trigger utilizar, especifíca melhor a tua situação.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Estude o comando INSERT ALL que resolve teu problema... e na consulta doINSERT ALL você seleciona a sequence mais os valores a serem inseridos...
Try000
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 23 Set 2010 9:36 am

Tentei de outra forma e deu certo muito obrigado pela dica...
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 9 visitantes