[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