[firebase-br] Receber Exception de SP com Select
Gladiston Santana
gladiston em vidy.com.br
Ter Jan 31 13:58:32 -03 2017
Faça da seguinte forma, inclua o campo RESULT_ERROR e/ou RESULT_ERROR_MSG
entre as variaveis que desejar retornar da procedure.
No inicio da procedure, coloque:
RESULT_ERROR=0;
RESULT_ERROR_MSG=''
Dentro da sua procedure, quando houver um erro, identifique RESULT_ERROR
com algum valor >0 e se quiser descrever uma mensagem então
RESULT_ERROR_MSG='descricao do erro' e conclua a procedure com suspend
seguido por um exit:
if ((select ID_CLIENTE from VENDAS where (ID =:iidvenda)) <> :iidcliente)
then
begin
RESULT_ERROR=2;
RESULT_ERROR_MSG='Registro não encontrado';
suspend;
exit;
end
Daí no php, apanhe essas duas variáveis e saberá que $RESULT_ERROR=0 é
porque foi concluída corretamente e >0 é porque houve erros e se precisar
exiba $RESULT_ERROR_MSG.
Para trabalhar corretamente com php é mandatório que você não dê uma
exception literal numa procedure porque o lado cliente só poderia lidar com
ela em blocos de try/catch (try/exception do delphi) que nem sempre é
desejável.
Em 26 de janeiro de 2017 15:04, Carlos Andrade <krlosgilson em gmail.com>
escreveu:
> Olá a todos! A minha dúvida pode ser meio off-topic, mas sinceramente não
> sei mais a quem recorrer...
>
> Minha SP retorna alguns registros se os parâmetros de entrada forem
> válidos. A mesma faz uma verificação se o usuário logado na sessão do PHP é
> realmente o proprietário do registro, caso contrário, a SP retorna uma
> Exception da seguinte forma:
>
> -- Exception
> CREATE EXCEPTION ERRO_003 'Registro não pertence ao cliente.';
> -- Fim (Exception)
>
> -- SP
> CREATE OR ALTER PROCEDURE SP_VENDAS (
> iidvenda integer,
> iidcliente integer)
> returns (
> odata date,
> ovalor numeric(15,2))
> as
> begin
> if ((select ID_CLIENTE from VENDAS where (ID =:iidvenda)) <>
> :iidcliente) then
> exception ERRO_003;
>
> select DATA, VALOR from VENDAS
> where (ID =:iidvenda)
> into :ODATA, :OVALOR;
>
> suspend;
> end
> -- Fim(SP)
>
> Fazendo o Select através do IBexpert, a Exception é gerada normalmente
> quando é informado o código do cliente que não pertence à venda que iria
> retornar.
>
> O Problema é que no PHP, a Exception não é retornada, percebe-se que a
> Exception ocorreu porque não retorna nenhum registro, mas também não recebo
> a mensagem do erro. Creio que também não seja erro no meu script PHP, pois
> quando chamo a procedure desta forma: "execute procedure SP_VENDAS(1,1)", a
> Exception é gerada normalmente, mas o que estou precisando é fazer uma
> seleção assim: "select ODATA, OVALOR from SP_VENDAS(1,1)".
>
> Alguma idéia de como eu poderia alterar a SP para que seja realmente
> enviada a mensagem do erro para o PHP?
>
Mais detalhes sobre a lista de discussão lista