SELECT SINGLE vs SELECT UP TO 1 ROWS
É pá, esta é uma daquelas discussões infinitas que nunca chegarão a lado nenhum. Igual a tentar decidir se mereces continuar a viver se meteres ananás na pizza ou queijo Filadélfia no sushi.
É pá, esta é uma daquelas discussões infinitas que nunca chegarão a lado nenhum. Igual a tentar decidir se mereces continuar a viver se meteres ananás na pizza ou queijo Filadélfia no sushi.
Durante anos explicaram-me que se deve usar UP TO 1 ROWS quando a chave não é completa. A minha professora primária disse que devemos sempre perguntar porquê: porquê? Ninguém explica.
Quando vais modificar registos na base de dados é comum fazeres primeiro um SELECT para ver como as coisas são e depois então fazeres UPDATE como as coisas serão.
No outro dia encontrei um programa que gerava um comando SQL com base em várias variáveis fixadas no código. Mas, por distracção ou ignorância, a alminha que fez aquilo achou que fazia sentido associar essas variáveis a símbolos de texto. Algo assim:
[Artigo por Artur Moreira]
A SAP introduziu a partir da versão 7.4 do ABAP o conceito de Code PushDown, que significa utilizar mais a base de dados para cálculos (agregação de dados, somas e vários cálculos prévios).
Por vezes o SQL do ABAP não te permite fazer coisas que conseguirias fazer usando SQL nativo da base de dados. É possível fazê-lo.
O Toad é uma ferramenta muito famosa no mundo SQL que permite construir e executar queries SQL de forma fácil e interactiva. E agora, graças ao senhor Sébastien HERMANN, o SAP tem uma versão simplificada desta ferramenta maravilha.
Obrigado Sérgio Fraga por descobrires isto.
O Abapinho saúda-vos.
Pedem-te para seleccionares registos cujo critério é um conjunto de meia dúzia de códigos que são conhecidos e nunca vão mudar. Sabias que podes fazer tudo logo no SELECT?
Prepara-te porque em breve terás muitas surpresas. É que o ABAP está a aprender troques novos. Repara neste:
CONSTANTS:
lc_menina TYPE STRING VALUE ‘MENINA',
lc_menino TYPE STRING VALUE ‘MENINO’,
lc_senhor TYPE STRING VALUE ’SENHOR’,
lc_senhora TYPE STRING VALUE ‘SENHORA’.
SELECT nome,
CASE
WHEN sexo_id = ‘M' AND idade < 18 THEN @lc_menino
WHEN sexo_id = ‘F’ AND idade < 18 THEN @lc_menina
WHEN sexo_id = ‘M' AND idade >=18 THEN @lc_senhor
WHEN sexo_id = ‘F’ AND idade >=18 THEN @lc_senhora
END AS titulo
FROM zpessoa
WHERE pessoa_id = @pessoa_id
INTO CORRESPONDING FIELDS OF @lt_pessoas.Só tens de esperar pela versão 7.40.
Uma vez que as operações de dados estão muito mais optimizadas no servidor de base de dados do que no ABAP, é sempre preferível o primeiro. FOR ALL ENTRIES só deve ser usado quando não se conseguir fazer INNER JOIN (como com a BSEG por exemplo). Quando possível, usar RANGES artificiais é preferível a usar FOR ALL ENTRIES mas é preciso cuidado para não ultrapassar o limite do parser de SQL. Depende do servidor de base de dados mas regra geral é de evitar RANGES com mais de 1000 linhas. Claro que ao usar FOR ALL ENTRIES nunca te podes esquecer de verificar que a tabela interna não está vazia caso contrário todas as entradas da tabela serão lidas.