Questão de Banco de Dados — PL/SQL e Outras Extensões SQL — FUNDATEC 2025
- Código
- qa699061
- Banca
- FUNDATEC
- Órgão
- PROCERGS
- Ano
- 2025
- Cargo
- ANC ( )
- A8
- B08
- C80
- DNULL
- EApresenta erro de sintaxe
GabaritoA — 8
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..
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).
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
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.
Ler a data como 8 de janeiro, invertendo dia e 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.
De onde vem cada valor: = passo 1: 1º de agosto de 2025
Extrair o mês em vez do dia, pensando que o segundo campo é o mês.
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.
De onde vem cada valor: = passo 2: 1 · = enunciado: LPAD(EXTRACT(DAY FROM V_DATE), 2, '0') · = enunciado: LPAD(EXTRACT(DAY FROM V_DATE), 2, '0')
Achar que LPAD não faz nada porque o dia já tem um dígito, mas ele adiciona o zero.
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.
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