Pular para o conteúdo principal

Questão de Banco de Dados — PostgreSQL — FCC 2025

Banco de DadosPostgreSQL
Código
fc150344
Banca
FCC
Órgão
TRT 15
Ano
2025
Cargo
AJ TRT15
Considere que exista um banco de dados PostgreSQL aberto e funcionando em condições ideais, e que a tabela t_processos exista e esteja corretamente preenchida com valores adequados.   Neste contexto, observe a função abaixo.   CREATE FUNCTION atualizar_status_processo (num_processo VARCHAR) RETURNS INTEGER AS $$ DECLARE     total INTEGER; BEGIN     UPDATE t_processos     SET status processo = 'Encerrado'     WHERE numero_processo = num_processo;     SELECT COUNT (*) INTO total FROM t_processos WHERE status_processo = 'Encerrado';     RETURN total; END; $$ LANGUAGE plpgsql;   Em condições ideias, esta função seria corretamente chamada utilizando-se o comando:
  1. ACALL atualizar_status_processo ('12345-67.2023.5.01.0001');
  2. BEXECUTE atualizar_status_processo ('12345-67.2023.5.01.0001');
  3. CDO $$ BEGIN PERFORM atualizar_status_processo ('12345-67.2023.5.01.0001'); END; $$ LANGUAGE plpqsql;
  4. DSELECT atualizar_status_processo ('12345-67.2023.5.01.0001');
  5. EEXEC atualizar_status_processo '12345-67.2023.5.01.0001';
Revelar gabarito e comentário

GabaritoD — SELECT atualizar_status_processo ('12345-67.2023.5.01.0001');

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”.

Chamada de funções em PostgreSQL: SELECT como forma de invocação

Gabarito: letra D. Em PostgreSQL, funções definidas com LANGUAGE plpgsql que retornam um valor (como RETURNS INTEGER) são chamadas por meio de um comando SELECT, e não por CALL, EXECUTE ou EXEC. A alternativa D — SELECT atualizar_status_processo ('12345-67.2023.5.01.0001'); — é a única sintaxe válida para invocar a função definida no enunciado.

A questão cobra um ponto específico da linguagem procedural do PostgreSQL (PL/pgSQL): a forma de invocar uma função que retorna um valor. Diferentemente de outros SGBDs, como o Oracle, onde se usa EXECUTE ou SELECT ... FROM, no PostgreSQL a chamada de uma função que retorna um escalar é feita diretamente com SELECT nome_da_funcao(argumentos);. Isso ocorre porque, no PostgreSQL, toda função que retorna um valor pode ser usada como uma expressão em uma consulta SELECT — inclusive funções que executam comandos DML internamente, como é o caso da função do enunciado, que faz um UPDATE e depois retorna um inteiro.

A função atualizar_status_processo é criada com CREATE FUNCTION ... RETURNS INTEGER AS $$ ... $$ LANGUAGE plpgsql;. Ela não é um procedimento (que não retorna valor), mas uma função que retorna um inteiro. No PostgreSQL, a distinção entre função e procedimento é relevante: funções retornam um valor e são chamadas com SELECT; procedimentos (criados com CREATE PROCEDURE) não retornam valor e são chamados com CALL. Como a função do enunciado retorna INTEGER, a chamada correta é via SELECT.

Na prática, ao executar SELECT atualizar_status_processo('12345-67.2023.5.01.0001');, o PostgreSQL executa o corpo da função — o UPDATE na tabela t_processos e o SELECT COUNT(*) — e retorna o valor inteiro correspondente ao total de processos com status 'Encerrado'. Esse valor pode ser exibido diretamente ou usado em outras expressões SQL.

A pegadinha da banca está em confundir a sintaxe de chamada de funções com a de procedimentos ou com comandos de outros SGBDs. O candidato que conhece Oracle pode ser tentado a usar EXECUTE ou EXEC, mas no PostgreSQL esses comandos não existem para chamar funções. O comando CALL é exclusivo para procedimentos (criados com CREATE PROCEDURE), não para funções. E a alternativa C, que usa DO $$ ... PERFORM ... $$, é uma forma de executar um bloco anônimo, mas contém um erro de digitação (LANGUAGE plpqsql em vez de plpgsql) e, mesmo corrigida, não é a forma direta de chamar a função — PERFORM é usado dentro de blocos PL/pgSQL para executar funções que retornam valor, mas não é a chamada direta solicitada.

Guarde a regra: função que retorna valor → SELECT; procedimento → CALL; bloco anônimo → DO. É exatamente essa distinção que separa a alternativa correta das demais.

  1. 1Função (RETURNS)
  2. 2SELECT nome(args)
  3. 3Procedimento (sem retorno)
  4. 4CALL nome(args)
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

CALL é o comando usado para invocar procedimentos (criados com CREATE PROCEDURE), não funções. A função do enunciado foi criada com CREATE FUNCTION e retorna um inteiro, portanto não pode ser chamada com CALL. No PostgreSQL, CALL só é válido para procedimentos que não retornam valor.

Alternativa B — ❌ Incorreta

EXECUTE não é um comando SQL do PostgreSQL para chamar funções. Em outros SGBDs, como Oracle, EXECUTE (ou EXEC) é usado para executar procedimentos, mas no PostgreSQL essa sintaxe não existe. A forma correta é SELECT.

Alternativa C — ❌ Incorreta

A alternativa usa DO $$ ... $$ LANGUAGE plpqsql; — além do erro de digitação (plpqsql em vez de plpgsql), o comando DO executa um bloco anônimo, não uma função. Dentro do bloco, PERFORM é usado para executar funções que retornam valor, mas isso não é a chamada direta da função como pede o enunciado. Mesmo corrigindo o erro de digitação, a forma correta de chamar a função é SELECT.

Alternativa D — ✅ Correta ⟵ GABARITO

SELECT atualizar_status_processo ('12345-67.2023.5.01.0001'); é a sintaxe correta para invocar uma função que retorna um valor no PostgreSQL. A função é executada e o valor inteiro retornado é exibido. Essa é a forma padrão de chamar funções em PL/pgSQL.

Alternativa E — ❌ Incorreta

EXEC é uma abreviação de EXECUTE, que não é um comando válido no PostgreSQL para chamar funções. Além disso, a sintaxe EXEC atualizar_status_processo '12345-67.2023.5.01.0001' não usa parênteses para os argumentos, o que também é inválido. A forma correta é SELECT com parênteses.

NÃO CAIA NESSA!

A banca explora a confusão entre função e procedimento. No PostgreSQL, função retorna valor e é chamada com SELECT; procedimento não retorna valor e é chamado com CALL. Quem conhece Oracle tende a marcar EXECUTE ou EXEC, mas essas sintaxes não existem no PostgreSQL. Fique atento: se a função tem RETURNS, a chamada é SELECT.

PEGA ESSA DICA!

Na prova, identifique se o objeto foi criado com CREATE FUNCTION ou CREATE PROCEDURE. Se for função, a chamada é SELECT nome(argumentos);. Se for procedimento, é CALL nome(argumentos);. Essa distinção resolve a maioria das questões sobre invocação no PostgreSQL.

Gabarito: letra D

Link permanente: /questoes/fc150344