Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Willian Dallastella

Function X SavePoint

Recommended Posts

Olá, boa noite.

 

Estou com o seguinte problema. Tenho um cadastro de aluno que é cadastrado em 3 tabelas, desta forma estou chamando uma function passando todos os dados e ela se vira para gravar cada coisa em sua tabela:

 

CODE
CREATE OR REPLACE FUNCTION insere_aluno (int4,varchar,varchar,varchar,timestamp,varchar,varchar,timestamp,varchar,varcha

r,varchar,varchar,varchar,varchar,varchar,timestamp,varchar,varchar,varchar,varch

ar,int4,varchar,varchar,varchar,varchar,varchar,varchar,varchar,timestamp,

varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,

varchar,varchar,timestamp,varchar,varchar)

RETURNS INTEGER AS $$

BEGIN

INSERT INTO aluno (id_aluno, no_aluno, nr_rg, no_orgao_exp_rg, dt_exp_rg, nr_cpf, tp_estado_civil, dt_nascimento, ds_cidade_nasc, tp_uf_nasc, tp_sexo, ds_nacionalidade, tp_cor_pele, no_mae, no_pai, dt_hr_cadastro, ds_senha, ds_email, in_funcionario, in_dependente, id_responsavel, in_nec_especial, ds_profissao, in_foto, in_situacao, in_egresso, ds_info_compl, in_cartao_acesso, dt_cartao_acesso)

VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29);

INSERT INTO aluno_contato (id_aluno, ds_endereco, nr_endereco, nr_cep, ds_complemento, ds_bairro, ds_cidade, tp_uf, nr_fone_res, nr_fone_cel, nr_fone_com)

VALUES ($1,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39);

INSERT INTO aluno_historico_escolar (id_aluno, tp_grau, no_instituicao, dt_ano_conclusao, ds_cidade, tp_uf)

VALUES ($1,$40,$41,$42,$43,$44);

RETURN 0;

END;

$$ LANGUAGE plpgsql;

 

Pois bem, o problema é o seguinte, em caso de algum problema durante alguns dos inserts, eu tenho que voltar todos, desta forma fiz um savepoint:

 

CODE
CREATE OR REPLACE FUNCTION insere_aluno (int4,varchar,varchar,varchar,timestamp,varchar,varchar,timestamp,varchar,varcha

r,varchar,varchar,varchar,varchar,varchar,timestamp,varchar,varchar,varchar,varch

ar,int4,varchar,varchar,varchar,varchar,varchar,varchar,varchar,timestamp,

varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,

varchar,varchar,timestamp,varchar,varchar)

RETURNS INTEGER AS $$

BEGIN

SAVEPOINT sv_insere_aluno;

INSERT INTO aluno (id_aluno, no_aluno, nr_rg, no_orgao_exp_rg, dt_exp_rg, nr_cpf, tp_estado_civil, dt_nascimento, ds_cidade_nasc, tp_uf_nasc, tp_sexo, ds_nacionalidade, tp_cor_pele, no_mae, no_pai, dt_hr_cadastro, ds_senha, ds_email, in_funcionario, in_dependente, id_responsavel, in_nec_especial, ds_profissao, in_foto, in_situacao, in_egresso, ds_info_compl, in_cartao_acesso, dt_cartao_acesso)

VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29);

INSERT INTO aluno_contato (id_aluno, ds_endereco, nr_endereco, nr_cep, ds_complemento, ds_bairro, ds_cidade, tp_uf, nr_fone_res, nr_fone_cel, nr_fone_com)

VALUES ($1,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39);

INSERT INTO aluno_historico_escolar (id_aluno, tp_grau, no_instituicao, dt_ano_conclusao, ds_cidade, tp_uf)

VALUES ($1,$40,$41,$42,$43,$44);

RETURN 0;

IF <> successful_completion THEN

ROLLBACK TO SAVEPOINT sv_insere_aluno;

END IF;

END;

$$ LANGUAGE plpgsql;

 

Porém não funciona, diz que não dá para usar o savepoint.

Alguem sabe o que posso fazer ou alguma outra forma de resolver o problema? Pois terei outras tabelas com a mesma situação.

 

Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bom William...

 

Tentei executar seu codigo e percebi que dava erro na constante success_completion

 

Gerei uma funcao parecida com a sua mas que utiliza Exception ao tratar erro, permitindo assim um rollback;

CREATE OR REPLACE FUNCTION insere_teste_checkPoint (char(12),varchar(50), varchar(50)) RETURNS VOID AS $$

BEGIN

insert into teste VALUES($1);

insert into teste2 VALUES ($1, $2);

insert into teste3 VALUES ($1,$3);

EXCEPTION WHEN data_exception THEN BEGIN

ROLLBACK;

END;

return;

END; $$ Language 'plpgsql';

 

Tenta tratar tua função com Exception utilizando seus Error Codes.

No site http://www.postgresql.org/docs/8.2/interac...s-appendix.html tem uma lista dos Error codes do Exception.

 

 

Não necessita de um savepoint pelo que eu vi..ja que deseja que as 3 operações sejam realizadas, ou nenhum.. basta colocar um rollback.

 

 

Espero ter ajudado..

 

Att.. Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.