Tratamento de exceções de banco php e postgres
14/09/2014
0
Como posso fazer isso?
Obrigado.
Ed
Posts
15/09/2014
William
http://pt.stackoverflow.com/questions/2380/como-lan%C3%A7ar-minhas-pr%C3%B3prias-exce%C3%A7%C3%B5es-com-o-pdo
17/09/2014
Marisiana Battistella
17/09/2014
Wander Santos
17/09/2014
Marisiana Battistella
CREATE TABLE db (a INT PRIMARY KEY, b TEXT); CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS $$ BEGIN LOOP -- first try to update the key UPDATE db SET b = data WHERE a = key; IF found THEN RETURN; END IF; -- not there, so try to insert the key -- if someone else inserts the same key concurrently, -- we could get a unique-key failure BEGIN INSERT INTO db(a,b) VALUES (key, data); RETURN; EXCEPTION WHEN unique_violation THEN -- Do nothing, and loop to try the UPDATE again. END; END LOOP; END; $$ LANGUAGE plpgsql; SELECT merge_db(1, 'david'); SELECT merge_db(1, 'dennis');
17/09/2014
Ed
Primeiramente no pg_query eu coloquei o @ antes ficando '@pg_query', para não mostrar o erro ao usuário.
Depois para pegar o erro eu usei o comando 'pg_last_error()'.
E para tratar eu criei uma view onde pega qual chave estrangeira foi violada e mostra a mensagem personalizada ao usuário.
Obrigado a todos.
18/09/2014
Marisiana Battistella
Uma curiosidade: Essa view vc consegue utilizar em todas as functions?
18/09/2014
Ed
Primeiramente em todas as tabelas do meu banco eu coloquei um comentário, por exemplo, tabela alunos, coloquei o comentário 'Cadastro de alunos', e assim sucessivamente.
Depois eu criei a view, que segue o código abaixo.
CREATE OR REPLACE VIEW v_restricao_banco AS
SELECT tab.nome_restricao,
tab.tabela_origem,
tab.comentario_origem,
tab.tabela_destino,
tab.comentario_destino,
((('Restrição de integridade! O '||tab.comentario_destino)||' esta sendo usado pelo ')||tab.comentario_origem)||'.' AS excecao
FROM (SELECT c.conname AS nome_restricao,
t.relname AS tabela_origem,
obj_description(t.oid) AS comentario_origem,
t2.relname AS tabela_destino,
obj_description(t2.oid) AS comentario_destino
FROM pg_constraint c,
pg_class t,
pg_class t2,
pg_namespace n
WHERE c.conrelid = t.oid
AND c.confrelid = t2.oid
AND n.oid = t.relnamespace
AND n.oid = t2.relnamespace
AND n.nspname = 'public'
AND c.contype = 'f') tab
Depois que eu criei a view, quando dispara um erro de chave estrangeira eu faço o select abaixo para trazer a informação do problema mais limpo para o usuário verificar.
"select aa.excecao from v_restricao_banco aa where '".pg_last_error()."' like '%'||aa.nome_restricao||'%'".
19/09/2014
Marisiana Battistella
Mas vou fazer uma observação...
Você criou um objeto pra tratar uma situação que pode ser tratada na própria function, pois o postgreSQL tem recursos próprios pra tratar exceções.
Clique aqui para fazer login e interagir na Comunidade :)