Opa,

Em 16 de julho de 2010 13:59, Torgge <[email protected]> escreveu:

> Ok. Obrigado.
>

Vamos lá:

Este teste if (nid is not null) then você não precisa fazer:

Defina função como RETURNS NULL ON NULL INPUT, assim quando o valor de
entrada for nulo não executa a função é retorna null para você.

Coloque um BEGIN e um END; para definir o contexto da exceção, tem isso no
exemplo da minha função.


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

[]s
-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a