Pular para o conteúdo principal

Questão de Banco de Dados — Oracle — FUNDATEC 2025

Banco de DadosOracle
Código
qg474889
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2025
Nível
Superior
Cargo
Analista em Computação / Ênfase em Programação de Sistemas na Tecnologia JAVA
Qual é a saída apresentada após executar o seguinte trecho de código escrito em PL/SQL?Q59.png 601×146
  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 8 — alternativa A.

A ideia por trás

Em bancos de dados Oracle, os tipos de texto CHAR e VARCHAR2 guardam cadeias de caracteres, mas com comportamentos diferentes. CHAR é de comprimento fixo: se você declara CHAR(10) e guarda 'TRT11R', o Oracle completa com espaços à direita até dar 10 caracteres, então fica 'TRT11R '. Já VARCHAR2 é de comprimento variável: guarda exatamente o que você atribuiu, sem espaços extras. Essa diferença de armazenamento é o que muda o resultado de comparações.

Quando o Oracle compara um CHAR com um VARCHAR2, ele usa a regra de comparação com preenchimento de espaços (blank-padded comparison): os espaços à direita do CHAR são ignorados para efeito de igualdade. Assim, 'TRT11R' (VARCHAR2) é considerado igual a 'TRT11R ' (CHAR). Se os dois fossem VARCHAR2, a comparação seria caractere por caractere e os espaços fariam diferença, mas como um é CHAR, a regra especial se aplica.

Esta questão testa exatamente essa regra: você precisa saber que CHAR preenche com espaços e que, na comparação com VARCHAR2, esses espaços são ignorados. A partir daí, a condição IF é verdadeira e a saída é o que está no primeiro ramo.

O que a questão dá

  • nome1 VARCHAR2(10) := 'TRT11R'

  • nome2 CHAR(10) := 'TRT11R'

  • IF nome1 = nome2 THEN DBMS_OUTPUT.PUT_LINE('8'); ELSE DBMS_OUTPUT.PUT_LINE('80');

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

Passo 1 — Ver o que cada variável guarda

Antes de comparar, precisamos saber o conteúdo real de cada variável. nome1 é VARCHAR2(10) e recebe 'TRT11R', então guarda exatamente esses 6 caracteres. nome2 é CHAR(10) e recebe o mesmo texto, mas por ser CHAR, o Oracle completa com espaços até 10 caracteres, então guarda 'TRT11R ' (com 4 espaços).

nome1 = 'TRT11R', nome2 = 'TRT11R '

NÃO CAIA NESSA!

Achar que CHAR guarda só o texto digitado, sem espaços — é justamente o contrário.

Passo 2 — Comparar os dois valores

Agora que sabemos o conteúdo, vamos avaliar a condição IF nome1 = nome2. Como um é VARCHAR2 e o outro é CHAR, o Oracle aplica a regra de comparação com preenchimento de espaços: ele ignora os espaços à direita do CHAR. Então 'TRT11R' é igual a 'TRT11R '.

Por que esta fórmula: A regra é do Oracle: na comparação entre CHAR e VARCHAR2, os espaços à direita do CHAR são desconsiderados. Isso é diferente de comparar dois VARCHAR2, onde os espaços contam.

condição TRUE

NÃO CAIA NESSA!

Pensar que os espaços fazem diferença e que a condição é falsa, marcando 80.

Passo 3 — Executar o ramo verdadeiro

Como a condição é verdadeira, o bloco executa o comando do THEN, que imprime '8'. O ELSE não é executado.

saıˊda:8\boxed{\text{sa}í\text{da}: 8}
NÃO CAIA NESSA!

Inverter os ramos e imprimir 80 por engano.

Resposta: 8 — alternativa A

Link permanente: /questoes/qg474889