Recentemente, em “Evitando Palavras-chave SQL ao Nomear Variáveis no PL/pgSQL do PostgreSQL”, explorei as dificuldades de usar palavras-chave SQL ao nomear variáveis em rotinas armazenadas no PostgreSQL. Mas esse não é o fim da história. Hoje, iremos mergulhar em uma questão relacionada e igualmente problemática: os nomes cíclicos, onde as variáveis ou parâmetros PL/pgSQL têm o mesmo nome que as colunas ou tabelas em seu banco de dados.
Ilustrando o Problema com um Exemplo
Imagine que temos a seguinte tabela em nosso banco de dados:
CREATE TABLE employees (
employee_id INTEGER,
name TEXT,
salary INTEGER
);
Agora, você está escrevendo uma função PL/pgSQL para calcular um bônus para um funcionário, e você decide chamar o parâmetro que representa o salário do funcionário de salary
. Veja o exemplo a seguir:
CREATE OR REPLACE FUNCTION calculate_bonus(salary INTEGER) RETURNS INTEGER AS $$
DECLARE
bonus INTEGER;
BEGIN
bonus := salary * 0.1;
RETURN bonus;
END;
$$ LANGUAGE plpgsql;
Agora, deseja-se utilizar essa função para calcular o bônus de cada funcionário, com base no salário registrado. A consulta pode ser assim:
SELECT employee_id, calculate_bonus(salary) AS bonus
FROM employees;
Aqui, temos um problema. Quando o PostgreSQL processa essa consulta, ele não sabe ao certo se salary
na função calculate_bonus
refere-se à coluna salary
da tabela employees
ou ao parâmetro salary
da função.
Práticas Recomendadas para Evitar Nomes Cíclicos
Para evitar esse tipo de confusão, seguem algumas práticas recomendadas:
- Prefixos claros para parâmetros de função: É uma boa prática usar prefixos para os parâmetros da função para distingui-los claramente dos nomes das colunas. Por exemplo, usar
p_
como prefixo, tornando o parâmetro de funçãop_salary
. - Nomes de variáveis significativos: Como discutido no artigo anterior, os nomes das variáveis devem ser claros e significativos, além de únicos para evitar conflitos com os nomes das colunas.
- Conhecimento da estrutura do banco de dados: Ter um bom entendimento da estrutura do seu banco de dados e dos nomes das colunas ajudará a evitar a criação inadvertida de variáveis ou parâmetros de função com o mesmo nome.