A instrução SEARCH ALL é usada para realizar uma pesquisa binária.
Quando você usar SEARCH ALL para executar uma procura binária, não é preciso setar o índice antes do mesmo iniciar.
O índice usado sempre é o associado com o primeiro index-name na cláusula OCCURS, e varia durante execução para
maximizar a eficiência de pesquisa.
Para usar a declaração SEARCH ALL, sua tabela deve estar ordenada pelas KEY(s) especificadas dentro da cláusula OCCURS.
Você pode especificar qualquer KEY dentro da condição WHEN, mas tudo que precede os data-names na opção KEY também
deve ser testado.
O teste deve ser uma condição EQUAL TO, e o data-name KEY ou tenha que ser o assunto da condição ou o nome de uma
variável condicional com que o nome a ser testado.
O condição WHEN também pode ser uma condição de combinação, formada de uma simple condição com AND como o único
conetivo lógico.
A KEY e seu objeto de comparação devem ser compatíveis, como declarado na relação regras de teste.
O seu formato geral é:
- identifier-1 (binary search)
- identifier-1 identifica a tabela que deve ser pesquisada.
O identifier-1 faz referência a todas as ocorrências nessa tabela.
A entrada de descrição de dados para o identifier-1 deve conter uma cláusula OCCURS com as frases INDEXED BY e KEY IS.
O identifier-1 pode fazer referência a um item de dados subordinado a um item de dados que contém uma cláusula OCCURS (ou seja, o identifier-1 pode ser uma
tabela subordinada em uma tabela multidimensional).
Nesse caso, a entrada de descrição de dados deve especificar uma frase INDEXED BY para cada dimensão da tabela.
O identifier-1 não deve ser subscrito ou modificado por referência.
- AT END
- A condição que existe quando a operação de pesquisa termina sem satisfazer as condições especificadas na frase WHEN.
A instrução SEARCH ALL executa uma pesquisa binária.
O índice associado ao identifier-1 (o índice de pesquisa) não precisa ser inicializado pelas instruções SET.
O índice de pesquisa é variado durante a operação de pesquisa para que seu valor não seja menor que o valor do primeiro elemento da tabela, nem seja maior que o
valor do último elemento da tabela.
O índice usado é sempre aquele associado ao primeiro nome do índice especificado na cláusula OCCURS.
Antes de usar uma pesquisa binária em uma tabela multidimensional, você deve executar instruções SET para definir o valor do índice para cada dimensão
superordenada.
A instrução SEARCH modifica apenas o valor no índice de pesquisa.
Portanto, para pesquisar uma tabela bidimensional a sete dimensional inteira, você deve executar uma instrução SEARCH para cada dimensão.
Nas frases WHEN, você deve especificar os índices para todas as dimensões.
Se a procura terminar sem que a condição WHEN seja atendida e a frase AT END seja especificada, a imperative-statement-1 será executada.
Se a frase AT END for omitida, o controle passará para a próxima instrução após a instrução SEARCH.
Os resultados de uma operação SEARCH ALL são previsíveis apenas quando:
- Os dados na tabela são ordenados em ordem ASCENDING KEY ou DESCENDING KEY
- O conteúdo das chaves ASCENDING ou DESCENDING especificado na cláusula WHEN fornece uma referência de tabela exclusiva.
WHEN phrase (binary search)
Se uma condição de relação for especificada na frase WHEN, a avaliação da relação será baseada no USAGE do item de dados referenciado por data-name-1.
O argumento de pesquisa é movido para um item de dados temporário com o mesmo uso como data-name-1 , e este item de dados temporário é utilizado para as operações
de comparar associada à busca.
Se a frase WHEN não puder ser satisfeita para qualquer configuração do índice dentro desse intervalo, a pesquisa não será bem-sucedida.
O controle é passado para a imperative-statement-1 da frase AT END, quando especificada, ou para a próxima instrução após a instrução SEARCH.
Em ambos os casos, a configuração final do índice não é previsível.
Se a frase WHEN puder ser satisfeita, o controle passará para a imperative-statement-2 , se especificada, ou para a próxima sentença executável, se a frase
NEXT SENTENCE for especificada.
O índice contém o valor que indica a ocorrência que permitiu que as condições WHEN fossem atendidas.
Depois que a imperative-statement-2 é executada, o controle passa para o final da instrução SEARCH, a menos que a imperative-statement-2 termine com uma instrução
GO TO.
- condition-name-1, condition-name-2
- Cada nome de condição especificado deve ter apenas um único valor e cada um deve estar associado a um item de dados ASCENDING KEY ou DESCENDING KEY para este
elemento da tabela.
- data-name-1, data-name-2
- Deve especificar um item de dados ASCENDING KEY ou DESCENDING KEY no elemento de tabela referenciado pelo identifier-1 e deve ser subscrito pelo primeiro
nome de índice associado aidentifier-1.
Cada nome de dados pode ser qualificado.
data-name-1 deve ser um operando válido para comparação com o identifier-3 , literal-1 ou aritmetic-expression-1 acordo com as regras de comparação.
data-name-2 deve ser um operando válido para comparação com o identifier-4 , literal-2 ou aritmetic-expression-2 acordo com as regras de comparação.
data-name-1 e data-name-2 não podem fazer referência:
- Itens de dados de ponto flutuante
- Agrupe itens que contêm itens de dados de ocorrência variável
- Campos de data com janelas
- identifier-3, identifier-4
-
Não deve ser um item de dados ASCENDING KEY ou DESCENDING KEY para o identifier-1 ou um item que esteja inscrito pelo primeiro nome de índice para o
identifier-1.
identifier-3 e identifier-4 não podem ser itens de dados definidos com qualquer um dos usos POINTER, FUNCTION-POINTER, PROCEDURE-POINTER ou
OBJECT REFERENCE.
identifier-3 e identifier-4 não podem ser campos de data em janela.
Se o identifier-3 ou literal-1 for da classe national, o data-name-1 deverá ser da classe national.
Se o identifier-4 ou literal-2 for da classe national, o data-name-2 deverá ser da classe national.
- literal-1, literal-2
-
literal-1 ou literal-2 deve ser um operando válido para comparação com data-name-1 ou data-name-2 , respectivamente.
- arithmetic-expression
-
Pode ser qualquer uma das expressões definidas em Arithmetic expressions, com a seguinte restrição:
Qualquer identificador em expressão aritmética não deve ser um item de dados ASCENDING KEY ou DESCENDING KEY para o identifier-1 ou um item que esteja inscrito
pelo primeiro nome de índice para identifier-1.
Pode ser qualquer uma das expressões definidas em Expressões aritméticas, com a seguinte restrição:
Qualquer identificador em expressão aritmética não deve ser um item de dados ASCENDING KEY ou DESCENDING KEY para o identifier-1 ou um item que esteja inscrito
pelo primeiro nome de índice para identifier-1.
Considerações sobre a instrução de pesquisa
Os itens de dados do índice não podem ser usados como subscritos, devido às restrições de referência direta a eles.
Para garantir a execução correta de uma instrução SEARCH para uma tabela de tamanho variável, verifique se o objeto da cláusula OCCURS DEPENDING ON (data-name-1)
contém um valor que especifica o comprimento atual da tabela.
O escopo de uma instrução SEARCH pode ser encerrado por qualquer um dos seguintes:
- Uma frase END-SEARCH no mesmo nível de aninhamento
- Um período separador
- Uma frase ELSE ou END-IF associada a uma instrução IF anterior
- AT END and WHEN phrases
- Depois que a imperative-statement-1 ou a imperative-statement-2 é executada, o controle passa para o final da instrução SEARCH, a menos que a
imperative-statement-1 ou a imperative-statement-2 terminem com uma instrução GO TO.
A função da frase AT END é a mesma para uma pesquisa serial e uma pesquisa binária.
- NEXT SENTENCE
- NEXT SENTENCE transfere o controle para a primeira instrução após o período separador mais próximo.
Quando NEXT SENTENCE é especificado com END-SEARCH, o controle não passa para a instrução após o END-SEARCH.
Em vez disso, o controle passa para a instrução após o período seguinte mais próximo.
Para a instrução SEARCH ALL do formato 2, nem a imperative-statement-2 nem a NEXT SENTENCE são necessárias.
Sem eles, a instrução SEARCH define o índice para o valor na tabela que corresponde à condição.
A função da frase NEXT SENTENCE é a mesma para uma pesquisa serial e uma pesquisa binária.
- END-SEARCH phrase
- Esse terminador de escopo explícito delimita o escopo da instrução SEARCH.
END-SEARCH permite que uma instrução SEARCH condicional seja aninhada em outra instrução condicional.
Para obter mais informações, consulte Delimited scope statements.
A função END-SEARCH é a mesma para uma pesquisa serial e uma pesquisa binária.
Veja tambem: