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

Olá pessoal, estou com um pequeno problema.

Na linguagem de Pl/sql

Tenho uma tabela ALUNO e uma PAGAMENTO

[code]
ALUNO
ALUNO_ID
NOME
ENDERECO

PAGAMENTO
PAGAMENTO_ID
ALUNO_ID
DESCRICAO[
…[/code]

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á.

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

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é!

[quote=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[/quote]

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

Valeu

[quote=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é![/quote]

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.