Como posso simular um SELECT CASE Dentro de uma Store Proced

Firebird

16/08/2005

Como posso simular um SELECT CASE Dentro de uma Store Procedure, pelo que vi ate agora só posso Utilizar IF-THEN ou IF-THEN-ELSE.

Estou Precisando Avaliar o Estado de 4 Parâmetros de entrada, para definir um FOR SELECT INTO especifico.

Tipo:
SELECT CASE :Data
Case Null
{...SQL-1...}

Case > ´16/08/2005´
{...SQL-2...}


Vagner Wolf

Vagner Wolf

Curtidas 0

Respostas

Afarias

Afarias

16/08/2005

algo como:

select campo_data from tabela where <alguma_coisa>
into :data;

if (data is null) then
begin
  for select ...
end

if (data > ´16.08.2005´) then
begin
  for select ...
end



T+


GOSTEI 0
Vagner Wolf

Vagner Wolf

16/08/2005

:D Saudações Mestre AFARIAS, Muito agradecido por vossa Colaboração.

Eu queria um modo mais facil de resolver este problema:

Na seleção do Estoque tenho uma chave composta por 4 registros
A = CODPRODUTO
B = LOTEPRODUTO
C = DATACADASTRO
D = HORACADASTRO

Gostaria que o banco selecionasse dinâmicamente, ao invés de jogar a responsabilidade para o software:

1) null,null,null,null = SELECT ALL
2) A,null,null,null = SELECT por CODPRODUTO
3) A,B,null,null = SELECT por CODPRODUTO + LOTE
4) null,null,c,null = SELECT por DATA DE CADASTRO
5) A,B,C,D = SELECT ESPECIFÍCO ( RETORNA 1 REGISTRO )

apenas com o IF then, fica um código muito sujo, por isso procurava outra estrutura, dai fica uma dúvida eu teria que utilizar EXIT, SUSPEND ou END? pois parece que se não utilizar o SUSPEND, O BANCO NAO COMPLETA TODOS OS ´FORSELECT INTO´ (FETCH??? - NÃO SEI O QUE É ISSO).


GOSTEI 0
Afarias

Afarias

16/08/2005

|Gostaria que o banco selecionasse dinâmicamente, ao invés de jogar a
|responsabilidade para o software:

Entendo, mas acho um caminho menos prático...


|apenas com o IF then, fica um código muito sujo,

Não necessariamente, vc pode delegar tarefas específicas a outros (sub) procedimentos de acordo com a consulta esperada.

Bom, algumas pessoas optam tb por montar o SQL dinamicamente no servidor, isto é possível usando as últimas versões do FB com o comando EXECUTE STATEMENT ... mas particularmente não gosto da abordágem.

Outra solução (nem sempre eficiente) é fazer tudo em 1 select apenas, ex:

SELECT * FROM TABELA
WHERE (:A IS NULL OR CODPRODUTO = :A)
AND ...



|dai fica uma dúvida eu teria que utilizar EXIT, SUSPEND ou END?

Vamos exclarecer: como é um procedimento de seleção vc sempre vai usar SUSPEND. Geralmente vc não usa EXIT nestes casos (o EXIT apenas encerra a execução do procedimento). E o END é o END, apenas fecha um BEGIN.


|pois parece que se não utilizar o SUSPEND, O BANCO NAO COMPLETA
|TODOS OS ´FORSELECT INTO´

Se não usar SUSPEND o banco não envia o registro de volta para o cliente.


|(FETCH??? - NÃO SEI O QUE É ISSO).

Fetch é uma operação do CLIENTE, informando o servidor para enviar o(s) próximo(s) regirtro(s).


T+


GOSTEI 0
Vagner Wolf

Vagner Wolf

16/08/2005

:D Sucesso, muito Obrigado....
Seguindo sua orientação cosegui estruturar a Procedure, e esta funcionando muito bem!

Quanto a SQL Dinâmica, eu concordo contigo pois pelo que andei lendo, o banco teria que recompilar a cada consulta, solicitando recursos desnecessariamente.

Muito Obrigado
vagner Wolf


GOSTEI 0
POSTAR