Pular para o conteúdo principal

Questão de Banco de Dados — PL/SQL e Outras Extensões SQL — FUNDATEC 2025

Banco de DadosPL/SQL e Outras Extensões SQL
Código
qa699059
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2025
Cargo
ANC ( )
Qual é a saída apresentada após executar o seguinte trecho de código escrito em PL/SQL?   SET SERVEROUTPUT ON; DECLARE V_DATE1 DATE:= TO_DATE('2025-03-27', 'YYYY-MM-DD'); V_DATE2 DATE:= TO_DATE('2025-07-05', 'YYYY-MM-DD'); V_NUMBER NUMBER(2); BEGIN V_NUMBER:= MONTHS_BETWEEN(V_DATE1, V_DATE2); DBMS_OUTPUT.PUT_LINE(V_NUMBER); END;
  1. A-4
  2. B-3
  3. C3
  4. D4
  5. EApresenta erro de sintaxe
Revelar gabarito e comentário

GabaritoB — -3

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

Resolução

Gabarito: letra B — a conta chega a -3 — alternativa B.

A ideia por trás

MONTHS_BETWEEN é uma função do Oracle que calcula quantos meses existem entre duas datas. Ela devolve um número com casas decimais, porque considera a fração do mês baseada nos dias. Se a primeira data for anterior à segunda, o resultado é negativo; se for posterior, positivo.

A função faz a diferença data1 - data2 em meses. Para isso, o Oracle conta os meses completos e depois soma a fração de dias restante dividida por 31 (o número médio de dias considerado). Por isso, o resultado não é um inteiro, mas um valor com decimais. Quando esse valor é guardado em uma variável NUMBER(p), o Oracle arredonda para caber na precisão definida.

Esta questão testa dois pontos: a ordem dos argumentos (que torna o resultado negativo) e o efeito do tipo NUMBER(2), que arredonda o valor fracionário para um inteiro.

O que a questão dá

  • V_DATE1 = TO_DATE('2025-03-27', 'YYYY-MM-DD')

  • V_DATE2 = TO_DATE('2025-07-05', 'YYYY-MM-DD')

  • V_NUMBER declarado como NUMBER(2)

O que queremos: o valor exibido por DBMS_OUTPUT.PUT_LINE(V_NUMBER)

Passo 1 — Calcular a diferença em meses

Precisamos saber o valor exato que MONTHS_BETWEEN retorna antes de pensar no arredondamento. A função conta os meses completos entre as datas e depois adiciona a fração de dias.

Por que esta fórmula: MONTHS_BETWEEN(data1, data2) = (data1 - data2) em meses. Como V_DATE1 é anterior a V_DATE2, o resultado será negativo.

diferença = MONTHS_BETWEEN(V\_DATE1, V\_DATE2)

De onde vem cada valor: VDATE1V_DATE1 = enunciado: TO_DATE('2025-03-27', 'YYYY-MM-DD') · VDATE2V_DATE2 = enunciado: TO_DATE('2025-07-05', 'YYYY-MM-DD')

diferença = MONTHS_BETWEEN(TO\_DATE('2025-03-27', 'YYYY-MM-DD'), TO\_DATE('2025-07-05', 'YYYY-MM-DD')) = -3,258\ meses
NÃO CAIA NESSA!

Esquecer que a ordem importa: se inverter as datas, o resultado seria +3,258.

Passo 2 — Arredondar para caber em NUMBER(2)

A variável V_NUMBER foi declarada com precisão 2, ou seja, só pode guardar números com até 2 dígitos significativos. O valor -3,258 tem mais dígitos, então o Oracle arredonda para o inteiro mais próximo.

Por que esta fórmula: O arredondamento do Oracle para NUMBER(p) segue a regra padrão: se a parte decimal for 0,5 ou mais, arredonda para cima; caso contrário, para baixo. Aqui, 0,258 é menor que 0,5, então arredonda para -3.

V_NUMBER=ROUND(diferenc¸a)V\_NUMBER = \text{ROUND}(\text{diferença})

De onde vem cada valor: diferenc\cadiferença = passo 1: -3,258 meses

V_NUMBER=ROUND(3,258)=3V\_NUMBER = \text{ROUND}(-3{,}258) = \boxed{-3}
NÃO CAIA NESSA!

Achar que arredonda para -4 por ser negativo — o Oracle arredonda para o inteiro mais próximo, não para o mais distante de zero.

Resposta: -3 — alternativa B

Link permanente: /questoes/qa699059