Fórum Como posso simular um SELECT CASE Dentro de uma Store Proced #52286
16/08/2005
0
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
Curtir tópico
+ 0Posts
16/08/2005
Afarias
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
17/08/2005
Vagner Wolf
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
17/08/2005
Afarias
|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
17/08/2005
Vagner Wolf
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
Clique aqui para fazer login e interagir na Comunidade :)