Entendendo o FOR ALL ENTRIES

Atendendo a pedidos, vamos dar uma olhada no uso da cláusula FOR ALL ENTRIES no SELECT.

Isso é uma particularidade do Open SQL. Se não estou enganado, não há nada parecido em entras linguagens e é uma mão na roda quando queremos fazer um “JOIN” entre uma tabela transparente e uma tabela interna.

Usando

Apenas para entender, vamos fazer um SELECT com JOIN:

Nesse caso, temos um JOIN para buscar as informações do nome do cliente que está na tabela SCUSTOM, usando a chave estrangeira CUSTOMID (SCUSTOM-ID). Poderíamos fazer também de maneira diferente, usando a cláusula FOR ALL ENTRIES:

Nesse caso, usamos os dados que já tínhamos na tabela interna it_sbook para selecionar somente os clientes que estão nela, no campo CUSTOMID.

Não estou dizendo que o programa abaixo substitui o JOIN do primeiro exemplo, mas simplesmente para mostrar a utilização do FOR ALL ENTRIES. Em termos de performance, devemos tomar alguns cuidados:

Verificar se a tabela do FOR ALL ENTRIES está preenchida, caso contrário todos os dados da SCUSTOM será retornado

Não usar quando a tabela do FOR ALL ENTRIES for muito grande. Veja a explicação abaixo.

Como Funciona

Como eu disse acima, não temos nada parecido nas diversas variações de SQL, então vamos ver como o Data Base Interface executa o FOR ALL ENTRIES.

FOR ALL ENTRIES SQL Statement

O Data Base Interface converte para um SELECT com um WHERE usando operador IN listando todas as ocorrências da tabelas do FOR ALL ENTRIES.

Por isso que se se a tabela do FOR ALL ENTRIES estiver em vazia, o Data Base Interface não monta o WHERE, executando um SELECT sem ela, podendo retornar toda a tabela SCUSTOM.

Outra medida que deve ser tomada é a eliminação das entradas repetidas, usando o comando DELETE ADJACENT DUPLICATES. Mas cuidado, pois ao eliminar as entradas repetidas, você irá perder dados da tabela it_sbook, pois eu criei uma cópia dela somente para executar o SELECT e depois ela é eliminada, usando o comando REFRESH.