Pl/sql Recuperar Chave primária e inserir na estrangeira

4 respostas
r-ngarcia

Olá pessoal, estou com um pequeno problema.

Na linguagem de Pl/sql

Tenho uma tabela ALUNO e uma PAGAMENTO
ALUNO
ALUNO_ID
NOME
ENDERECO
..

PAGAMENTO
PAGAMENTO_ID
ALUNO_ID
DESCRICAO[
..

Então, como podem ver na tabela pagamento eu tenho uma chave estrangeira que recebe a chave primária da tabela aluno.
O problema é que eu preciso inserir automaticamente os pagamentos logo após cadastrar o aluno,
para isso preciso da ID do aluno, como faço pra recuperar a ID inserida sem que prejudique o sistema no caso de várias pessoas cadastrarem alunos ao mesmo tempo.

Obrigado desde já.

4 Respostas

D

kra, nã osei se entendi direito, mas vc poderia usar uma trigger. Mas ai tb depende do banco que vc vai usar, cada um eh criado de um tipo.

flw

G

Olá!

Caso o incremento da PK esteja sendo feito por sequence você pode recuperar o valor corrente da sua sessão com

SEQ_ALUNO.CURRVAL

assim basta inserir

INSERT INTO ALUNO (ALUNO_ID, NOME, ENDERECO) VALUES (SEQ_ALUNO.NEXTVAL, 'NOME', 'ENDEREÇO');

INSERT INTO PAGAMENTO (PAGAMENTO_ID, ALUNO_ID, DESCRICAO) VALUES (SEQ_PAGAMENTO.NEXTVAL, SEQ_ALUNO.CURRVAL, 'DESCRIÇÃO');

Há a possibilidade de fazer com SP (stored procedure) utilizando-se da cláusula RETURNING

CREATE PROCEDURE PROC_INSERT_ALUNOPGTO(P_NOME ALUNO.NOME%TYPE, P_ENDERECO ALUNO.ENDERECO%TYPE, P_DESCRICAO PAGAMENTO.DESCRICAO%TYPE) AS
   V_ID_ALUNO ALUNO.ALUNO_ID%TYPE;
BEGIN
   INSERT INTO ALUNO (NOME, ENDERECO) VALUES (P_NOME, P_ENDERECO) RETURNING ALUNO_ID INTO V_ID_ALUNO;

   INSERT INTO PAGAMENTO (ALUNO_ID, DESCRICAO) VALUES (V_ID_ALUNO, P_DESCRICAO);
END;
/

Com SP poderia utilizar CURRVAL também ao invés de RETURNING, depende da sua necessidade.
Uma outra forma seria com TRIGGER no evento AFTER INSERT da tabela ALUNO

CREATE TRIGGER TRG_AI_ALUNO
   AFTER INSERT ON ALUNO
   FOR EACH ROW
BEGIN
   INSERT INTO PAGAMENTO (ALUNO_ID, DESCRICAO) VALUES (:NEW.ALUNO_ID, 'DESCRIÇÃO');
END;

Bom, essas são as formas de recuperar que eu conheço, espero que te ajude.
Até!

r-ngarcia

dkenji:
kra, nã osei se entendi direito, mas vc poderia usar uma trigger. Mas ai tb depende do banco que vc vai usar, cada um eh criado de um tipo.

flw

Valeu cara, o banco é Oracle mesmo, acho que com trigger deve dar certo, mas não sei como.

Valeu

r-ngarcia

Granella:
Olá!

Caso o incremento da PK esteja sendo feito por sequence você pode recuperar o valor corrente da sua sessão com

SEQ_ALUNO.CURRVAL

assim basta inserir

INSERT INTO ALUNO (ALUNO_ID, NOME, ENDERECO) VALUES (SEQ_ALUNO.NEXTVAL, 'NOME', 'ENDEREÇO');

INSERT INTO PAGAMENTO (PAGAMENTO_ID, ALUNO_ID, DESCRICAO) VALUES (SEQ_PAGAMENTO.NEXTVAL, SEQ_ALUNO.CURRVAL, 'DESCRIÇÃO');

Há a possibilidade de fazer com SP (stored procedure) utilizando-se da cláusula RETURNING

CREATE PROCEDURE PROC_INSERT_ALUNOPGTO(P_NOME ALUNO.NOME%TYPE, P_ENDERECO ALUNO.ENDERECO%TYPE, P_DESCRICAO PAGAMENTO.DESCRICAO%TYPE) AS
   V_ID_ALUNO ALUNO.ALUNO_ID%TYPE;
BEGIN
   INSERT INTO ALUNO (NOME, ENDERECO) VALUES (P_NOME, P_ENDERECO) RETURNING ALUNO_ID INTO V_ID_ALUNO;

   INSERT INTO PAGAMENTO (ALUNO_ID, DESCRICAO) VALUES (V_ID_ALUNO, P_DESCRICAO);
END;
/

Com SP poderia utilizar CURRVAL também ao invés de RETURNING, depende da sua necessidade.
Uma outra forma seria com TRIGGER no evento AFTER INSERT da tabela ALUNO

CREATE TRIGGER TRG_AI_ALUNO
   AFTER INSERT ON ALUNO
   FOR EACH ROW
BEGIN
   INSERT INTO PAGAMENTO (ALUNO_ID, DESCRICAO) VALUES (:NEW.ALUNO_ID, 'DESCRIÇÃO');
END;

Bom, essas são as formas de recuperar que eu conheço, espero que te ajude.
Até!

Cara muito obrigado mesmo, Acho que esse currval deve resolver, já tinha ouvido alguma coisa a respeito mas só que não sabia como usar.

Valeu cara, vou testar, qualquer coisa eu pergunto denovo.

Até mais.
E mais uma vez obrigado.

Criado 7 de novembro de 2010
Ultima resposta 7 de nov. de 2010
Respostas 4
Participantes 3