Como posso simular um SELECT CASE Dentro de uma Store Proced
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...}
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
Curtidas 0
Respostas
Afarias
16/08/2005
algo como:
T+
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
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).
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
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:
|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+
|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
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
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