Ok. Obrigado.
Alterei a function para:
CREATE OR REPLACE FUNCTION "public"."moeda_d" (nid integer) RETURNS boolean
AS
$body$
begin
if (nid is not null) then
savepoint p1;
delete from public.moeda
where public.moeda.id = nid;
rollback to p1;
update public.moeda set
ativo = 0,
datalt = now()
where id = nid;
end if;
RETURN TRUE;
exception
when foreign_key_violation then
RETURN false;
end;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
mas agora da erro no savepoint: ERRO: SPI_execute_plan failed executing
query "savepoint p1": SPI_ERROR_TRANSACTION
CONTEXT: PL/pgSQL function "moeda_d" line 5 at SQL statement
Em 16 de julho de 2010 11:44, JotaComm <[email protected]> escreveu:
> Olá,
>
> Em 16 de julho de 2010 11:21, Torgge <[email protected]> escreveu:
>
> Mas isso não é exclusão física ? Vou tentar alterar a exception others para
>> essa que me passou foreign_key_violation.
>>
>
>
> Sim. E para excluir fisicamente. Agora se você quer excluir logicamente
> faça um tratamento diferente, pois apenas coloquei uma idéia de como você
> poderia trabalhar.
>
>
>
>
>> Em 16 de julho de 2010 10:38, JotaComm <[email protected]> escreveu:
>>
>> Olá,
>>>
>>> Que tal fazer um tratamento assim:
>>>
>>> Em 16 de julho de 2010 10:22, Torgge <[email protected]> escreveu:
>>>
>>> Isso é para exclusão lógica, meu campo ativo controla isso. Porém faço o
>>>> delete para verificar se o registro esta linkado a alguma
>>>> outra tabela, se o comando delete der exception quer dizer que não posso
>>>> exclui-lo então "não posso exclui-lo logicamente tb",
>>>> se não der exception no delete, quer dizer que "eu posso exclui-lo
>>>> logicamente", o problema é que esta dando exception no
>>>> update. Então sempre esta retornando false, quando executo essa function
>>>> no debug do (EMS Postgres) ele retorna true,
>>>> mas quando executo ele normalmente retorna false.
>>>>
>>>
>>> Que tal fazer um tratamento assim:
>>>
>>> CREATE OR REPLACE FUNCTION f_delete(INTEGER)
>>>
>>> RETURNS BOOLEAN AS $$
>>>
>>> BEGIN
>>>
>>> BEGIN
>>>
>>> DELETE FROM tabela WHERE codigo=$1;
>>>
>>> EXCEPTION WHEN foreign_key_violation THEN
>>>
>>> RAISE NOTICE 'Registro % não pode ser excluído.',$1;
>>>
>>> RETURN FALSE;
>>>
>>> END;
>>>
>>> RAISE NOTICE 'Registro pode ser excluído: %',$1;
>>>
>>> RETURN TRUE;
>>>
>>> END;
>>>
>>> $$ LANGUAGE PLPGSQL RETURNS NULL ON NULL INPUT;
>>>
>>>
>>>> Em 16 de julho de 2010 09:05, JotaComm <[email protected]> escreveu:
>>>>
>>>> Olá,
>>>>>
>>>>>
>>>>>
>>>>> Em 16 de julho de 2010 08:56, Torgge <[email protected]> escreveu:
>>>>>
>>>>> Bom dia.
>>>>>> Uma dúvida com a uma funcion:
>>>>>> CREATE OR REPLACE FUNCTION padrao.moeda_d
>>>>>> (
>>>>>> nid integer
>>>>>> )
>>>>>> RETURNS boolean AS
>>>>>> $$
>>>>>> begin
>>>>>> if (nid is not null) then
>>>>>> savepoint p1;
>>>>>>
>>>>>> delete from padrao.moeda
>>>>>> where padrao.moeda.id = nid;
>>>>>>
>>>>>> rollback to p1;
>>>>>>
>>>>>> update padrao.moeda set
>>>>>> ativo = 0,
>>>>>> datalt = now()
>>>>>> where id = nid;
>>>>>>
>>>>>> end if;
>>>>>>
>>>>>> RETURN TRUE;
>>>>>>
>>>>>> exception
>>>>>> when others then
>>>>>> RETURN false;
>>>>>> end;
>>>>>> $$
>>>>>> LANGUAGE 'plpgsql'
>>>>>> VOLATILE
>>>>>> CALLED ON NULL INPUT
>>>>>> SECURITY INVOKER
>>>>>> COST 100;
>>>>>>
>>>>>> Ela sempre retorna false, quando passa pelo update da exception,
>>>>>> alguma sugestão de como fazer corretamente ?
>>>>>>
>>>>>
>>>>> Sempre que cair na excpetion vai retornar false. Não isso que você
>>>>> quer?
>>>>>
>>>>> O que você quer fazer exatamente? Não entendi muito bem sua idéia, pois
>>>>> você faz um delete e depois faz o rollback para o seu savepoint definido e
>>>>> depois faz um update. Poderia explicar sua idéia, assim fica mais fácil
>>>>> ajudarmos.
>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> pgbr-geral mailing list
>>>>>> [email protected]
>>>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>>>
>>>>>>
>>>>>
>>>>> []s
>>>>> --
>>>>> JotaComm
>>>>> http://jotacomm.wordpress.com
>>>>>
>>>>> _______________________________________________
>>>>> pgbr-geral mailing list
>>>>> [email protected]
>>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> pgbr-geral mailing list
>>>> [email protected]
>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>
>>>>
>>>
>>> []s
>>> --
>>> JotaComm
>>> http://jotacomm.wordpress.com
>>>
>>> _______________________________________________
>>> pgbr-geral mailing list
>>> [email protected]
>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>
>>>
>>
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>>
>
> []s
> --
> JotaComm
> http://jotacomm.wordpress.com
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral