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:
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.
1Função (RETURNS)
2SELECT nome(args)
3Procedimento (sem retorno)
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.