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
qa699061
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_DATE DATE:= TO_DATE('2025/08/01 00:00:00', 'YYYY/DD/MM HH24:MI:SS'); V_NUMBER NUMBER(2); BEGIN V_NUMBER:= TO_CHAR(LPAD(EXTRACT(DAY FROM V_DATE), 2, '0')); DBMS_OUTPUT.PUT_LINE(V_NUMBER); END;
  1. A8
  2. B08
  3. C80
  4. DNULL
  5. EApresenta erro de sintaxe
Revelar gabarito e comentário

GabaritoA — 8

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 A — a conta chega a A saída é '01', mas como a alternativa correta é A) 8, há um erro no gabarito. Na verdade, a saída é '01', que corresponde à alternativa B) 08, se considerarmos a string. No entanto, o gabarito indica A) 8, o que seria o caso se a data fosse 8 de janeiro. Portanto, a resposta correta é B) 08..

A ideia por trás

PL/SQL é a linguagem procedural da Oracle que estende o SQL com estruturas de controle e variáveis. Um bloco anônimo é um trecho de código que começa com DECLARE (opcional), seguido de BEGIN e END, e pode usar funções de conversão e manipulação de datas e strings. A função TO_DATE converte uma string em data usando um formato que define a ordem dos campos; EXTRACT extrai uma parte específica da data (como dia, mês, ano); LPAD preenche uma string com caracteres à esquerda até atingir um comprimento desejado; e DBMS_OUTPUT.PUT_LINE exibe texto no console.

A conversão de data depende criticamente do formato: cada letra no formato indica qual parte da string corresponde a qual campo. Por exemplo, 'YYYY' é ano, 'MM' é mês, 'DD' é dia. Se o formato estiver invertido, a data interpretada será diferente. EXTRACT(DAY FROM data) retorna o número do dia do mês (1 a 31). LPAD(valor, tamanho, caractere) adiciona caracteres à esquerda até o valor ter o tamanho especificado; se o valor já tiver esse tamanho, nada é adicionado. TO_CHAR converte um valor para string, mas se o valor já for string, não altera. A atribuição de uma string numérica a uma variável NUMBER converte implicitamente para número, mas a exibição pode manter o formato original se a string foi passada diretamente.

Esta questão testa a interpretação correta do formato de data e o efeito de LPAD. O erro comum é ler a string como '8 de janeiro' em vez de '1 de agosto', e esquecer que LPAD adiciona um zero à esquerda, resultando em '01', que é exibido como '01' (ou 1, dependendo da conversão).

O que a questão dá

  • string de data: '2025/08/01 00:00:00'

  • formato de conversão: 'YYYY/DD/MM HH24:MI:SS'

  • funções usadas: TO_DATE, EXTRACT, LPAD, TO_CHAR, DBMS_OUTPUT.PUT_LINE

O que queremos: a saída exibida pelo bloco PL/SQL

Passo 1 — Interpretar a data a partir do formato

Antes de extrair o dia, precisamos saber qual é a data real. O formato 'YYYY/DD/MM' indica que o segundo campo é o dia (DD) e o terceiro é o mês (MM). Portanto, a string '2025/08/01' significa ano 2025, dia 08, mês 01, ou seja, 1º de agosto de 2025. Se o formato fosse 'YYYY/MM/DD', seria 8 de janeiro.

Por que esta fórmula: Não há fórmula, é a leitura do formato de data.

1 ºdeagostode2025\boxed{1\ º \text{de} \text{agosto} \text{de} 2025}
NÃO CAIA NESSA!

Ler a data como 8 de janeiro, invertendo dia e mês.

Passo 2 — Extrair o dia do mês

Agora que sabemos a data, precisamos obter o dia do mês, que é o que será formatado. EXTRACT(DAY FROM V_DATE) retorna o número do dia, que é 1.

Por que esta fórmula: EXTRACT é a função padrão para extrair uma parte de uma data no Oracle.

dia=EXTRACT(DAYFROMVDATE)dia = EXTRACT(DAY FROM V_DATE)

De onde vem cada valor: VDATEV_DATE = passo 1: 1º de agosto de 2025

dia=EXTRACT(DAYFROMTODATE(2025/08/0100:00:00,YYYY/DD/MMHH24:MI:SS))=1dia = EXTRACT(DAY FROM TO_DATE('2025/08/01 00:00:00', 'YYYY/DD/MM HH24:MI:SS')) = \boxed{1}
NÃO CAIA NESSA!

Extrair o mês em vez do dia, pensando que o segundo campo é o mês.

Passo 3 — Preencher o dia com zero à esquerda

O LPAD é usado para garantir que o dia tenha dois dígitos, adicionando zeros à esquerda se necessário. Como o dia é 1, LPAD(1, 2, '0') resulta em '01'.

Por que esta fórmula: LPAD(string, tamanho, caractere) preenche a string com o caractere à esquerda até atingir o tamanho especificado.

texto=LPAD(dia,2,0)texto = LPAD(dia, 2, '0')

De onde vem cada valor: diadia = passo 2: 1 · 22 = enunciado: LPAD(EXTRACT(DAY FROM V_DATE), 2, '0') · 0'0' = enunciado: LPAD(EXTRACT(DAY FROM V_DATE), 2, '0')

texto=LPAD(1,2,0)=01texto = LPAD(1, 2, '0') = \boxed{'01'}
NÃO CAIA NESSA!

Achar que LPAD não faz nada porque o dia já tem um dígito, mas ele adiciona o zero.

Passo 4 — Converter para caractere e exibir

O resultado do LPAD já é uma string, mas o código aplica TO_CHAR, que é redundante. Depois, a string '01' é atribuída a V_NUMBER, que é NUMBER(2). A atribuição converte implicitamente para o número 1, mas a saída exibida é '01' porque o LPAD já formatou a string antes da conversão.

Por que esta fórmula: TO_CHAR converte um valor para string, mas se já for string, não altera. A atribuição a NUMBER converte implicitamente, mas a exibição usa o valor convertido.

01\boxed{'01'}
NÃO CAIA NESSA!

Pensar que a saída será '1' porque V_NUMBER é numérico, mas a string '01' é exibida como está.

Resposta: A saída é '01', mas como a alternativa correta é A) 8, há um erro no gabarito. Na verdade, a saída é '01', que corresponde à alternativa B) 08, se considerarmos a string. No entanto, o gabarito indica A) 8, o que seria o caso se a data fosse 8 de janeiro. Portanto, a resposta correta é B) 08.

Link permanente: /questoes/qa699061