Questão de Banco de Dados — PostgreSQL — CESGRANRIO 2024
Banco de Dados›PostgreSQL
Código
cg057872
Banca
CESGRANRIO
Órgão
IPEA
Ano
2024
Cargo
TPP ( )
Considere que, em um banco de dados, há uma tabela com dados de indústrias, contendo os seguintes atributos: INDUSTRIA (cnpj, razao-social, capital-social, qtd-alteracoes) Nessa tabela, a chave primária é o atributo cnpj. Foi criada a seguinte stored procedure, codificada segundo a sintaxe do PostgreSQL: CREATE PROCEDURE atualiza_capital_social (id varchar(14), capital float) LANGUAGE plpgsql AS $$ DECLARE industria_cadastrada BOOLEAN; BEGIN SELECT TRUE INTO industria_cadastrada FROM INDUSTRIA WHERE cnpj = id; IF industria_cadastrada THEN UPDATE INDUSTRIA SET capital-social = capital, qtd-alteracoes = qtd-alteracoes + 1 WHERE cnpj = id; COMMIT; END IF; END; $$; Ao ser executada, essa procedure
Aaltera o capital social de todas as indústrias.
Bbusca as empresas com mais de uma alteração.
Cregistra a quantidade de alterações realizadas em todas as indústrias.
Dincrementa a quantidade de alterações de todas as indústrias de São Paulo.
Eatualiza o capital social de uma indústria e registra quantas alterações foram realizadas nesse capital social.
Revelar gabarito e comentário▾
GabaritoE — atualiza o capital social de uma indústria e registra quantas alterações foram realizadas nesse capital social.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Stored Procedure em PostgreSQL: Atualização Condicional
Gabarito: letra E. A procedure atualiza_capital_social recebe um CNPJ e um novo valor de capital, verifica se a indústria existe e, em caso positivo, atualiza o capital social e incrementa o contador de alterações apenas para aquele registro específico — exatamente o que descreve a alternativa E. A lógica é condicionada pela variável industria_cadastrada, que só é verdadeira quando o SELECT encontra uma linha com o CNPJ informado.
O que a procedure faz, passo a passo: primeiro, ela declara uma variável booleana industria_cadastrada. Em seguida, executa um SELECT TRUE INTO industria_cadastrada FROM INDUSTRIA WHERE cnpj = id. Esse comando atribui TRUE à variável se existir pelo menos uma linha com aquele CNPJ; caso contrário, a variável fica NULL (que é tratado como falso no IF). Depois, o IF industria_cadastrada THEN só executa o bloco de atualização se a indústria foi encontrada. Dentro do bloco, o UPDATE altera o capital-social para o novo valor e soma 1 ao qtd-alteracoes, mas somente na linha onde cnpj = id. O COMMIT confirma a transação. Se o CNPJ não existir, nada é feito — a procedure termina sem alterar nenhum registro.
O ponto central é o WHERE cnpj = id no UPDATE: ele restringe a operação a uma única linha, a da indústria cujo CNPJ foi passado como parâmetro. Sem esse filtro, o UPDATE afetaria todas as linhas da tabela — mas não é o caso aqui. A variável industria_cadastrada funciona como uma guarda: ela impede que o UPDATE seja executado para um CNPJ inexistente, evitando uma atualização silenciosa de zero linhas (o que não seria um erro, mas também não faria nada).
A pegadinha que a banca explora é justamente a combinação entre a verificação condicional e o filtro por chave primária. Alternativas como "altera o capital social de todas as indústrias" ou "incrementa a quantidade de alterações de todas as indústrias" ignoram o WHERE cnpj = id, que limita o escopo a um único registro. Outras, como "busca as empresas com mais de uma alteração" ou "incrementa a quantidade de alterações de todas as indústrias de São Paulo", introduzem elementos que não existem na procedure — não há filtro por quantidade de alterações nem por localização geográfica.
Guarde o critério decisivo: a procedure opera sobre uma única indústria, identificada pelo CNPJ, e somente se ela existir. É essa combinação de condição (IF) e filtro (WHERE) que separa a alternativa correta das demais.
Alternativa A — ❌ Incorreta
Afirma que a procedure altera o capital social de todas as indústrias. Isso seria verdade se o UPDATE não tivesse cláusula WHERE, mas o comando é UPDATE INDUSTRIA SET ... WHERE cnpj = id, que restringe a atualização à linha cujo CNPJ é igual ao parâmetro id. A palavra "todas" é o erro: a operação é pontual, não massiva.
Alternativa B — ❌ Incorreta
Diz que a procedure "busca as empresas com mais de uma alteração". A procedure não faz nenhuma consulta com filtro por qtd-alteracoes — ela apenas verifica se o CNPJ existe (SELECT TRUE ... WHERE cnpj = id) e, se existir, atualiza o capital e incrementa o contador. Não há lógica de busca ou seleção baseada na quantidade de alterações.
Alternativa C — ❌ Incorreta
Afirma que a procedure "registra a quantidade de alterações realizadas em todas as indústrias". O incremento de qtd-alteracoes só ocorre para a indústria cujo CNPJ foi passado como parâmetro, e apenas se ela existir. Não há atualização em massa — o WHERE cnpj = id limita o efeito a uma única linha.
Alternativa D — ❌ Incorreta
Menciona "todas as indústrias de São Paulo". A procedure não possui nenhum filtro por localização geográfica — não há atributo de cidade, estado ou região na tabela INDUSTRIA nem na lógica da procedure. O único filtro é por CNPJ. Essa alternativa introduz um elemento completamente alheio ao código.
Alternativa E — ✅ Correta ⟵ GABARITO
Descreve com precisão o comportamento: a procedure atualiza o capital social de uma indústria (a identificada pelo CNPJ passado como parâmetro) e registra quantas alterações foram realizadas nesse capital, incrementando qtd-alteracoes em 1 a cada execução bem-sucedida. A condição IF industria_cadastrada garante que a atualização só ocorra se a indústria existir, e o WHERE cnpj = id restringe a operação a um único registro.