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:

  1. 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ção p_salary.
  2. 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.
  3. 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.

Sobre o autor

Pós graduado em Gestão de Projetos em Tecnologia da Informação pela UNIASSELVI.
Esposo e Pai, curto atividades ao ar livre (Bike, SUP, Natação, Caminhar, Brincar no campo)

Atua com Banco de Dados Oracle desde de 2007. Atualmente é DBA Senior na FLUIDATA Serviços em Banco de dados (www.fluidata.com.br)

Principais atividade Banco de dados:

Implementação, migração, gerenciamento e suporte a produtos Oracle (8i, 9i, 10g, 11g, 12c, 18c, 19c RAC), multiplataforma;
Implementação, migração, gerenciamento e suporte a produtos Microsoft SQL Server (2008 - 2019);
Implementação, migração, gerenciamento e suporte a produtos PostgreSQL (9.3 - 14);
Monitoramento de ambientes 24×7;
Backup e Recovery;
Performance e Tuning;
Alta disponibilidade (HA);
EM database/grid/cloud control;
Conversão de databases;
Standby database / Oracle Data Guard;

Certificações:

Oracle Cloud Infrastructure 2019 Certified Architect AssociateOracle Cloud Infrastructure 2019 Certified Architect Associate
Oracle Database 12c Administrator Certified ProfessionalOracle Database 12c Administrator Certified Professional
Exadata Database Machine Models X2-2 and X2-8 Technology Support SpecialistExadata Database Machine Models X2-2 and X2-8 Technology Support Specialist
Oracle Database 11g Support SpecialistOracle Database 11g Support Specialist
OCP 11g - Oracle Certified Professional AdministratorOCP 11g - Oracle Certified Professional Administrator
OPN Certified Specialist 10g - PartnerNetwork Certified SpecialistOPN Certified Specialist 10g - PartnerNetwork Certified Specialist
Oracle Database 10g Real Applications Clusters AdministratorCertified ExpertOracle Database 10g Real Applications Clusters AdministratorCertified Expert
Oracle Database 10g: Managing Oracle on Linux Certified ExpertOracle Database 10g: Managing Oracle on Linux Certified Expert
OCP 10g - Oracle Certified Professional AdministratorOCP 10g - Oracle Certified Professional Administrator

Principais atividades DEVOPS:

PHP
ASP.net
C#
Docker
Golang
C++
Delphi
Python
HTML5
JavaScript

Você também pode gostar: