Questão nº 45

Questão de Tecnologia da Informação · FCC TRT-11 2017 (nº 45)

FCC2017Técnico Judiciário – Área Apoio Especializado – Especialidade: Tecnologia da InformaçãoTecnologia da Informação
Gabarito: Ever comentário ↓

Considere o seguinte trecho de código PL/SQL com as linhas numeradas à esquerda.

```sql
1 DECLARE
2 nome1 VARCHAR2(10) := 'TRT11R';
3 nome2 CHAR(10) := 'TRT11R';
4 BEGIN
5 IF nome1 = nome2 THEN
6 DBMS_OUTPUT.PUT_LINE(nome1 || ' igual a ' || nome2);
7 ELSE
8 DBMS_OUTPUT.PUT_LINE(nome2 || ' diferente de ' || nome1 );
9 END IF;
10 END;
11 /
```

Ao executar este código no Oracle 11g, em condições ideais,

Resposta comentada

Gabarito Alternativa E

O conceito-chave aqui é a diferença entre os tipos de dados de string VARCHAR2 e CHAR no Oracle, e como o Oracle compara valores desses tipos, especialmente em relação a espaços em branco no final. VARCHAR2 armazena strings de comprimento variável sem preenchimento de espaços, enquanto CHAR armazena strings de comprimento fixo, preenchendo com espaços à direita se a string for menor que o tamanho declarado.

(A) Incorreta: Esta alternativa estaria correta se o Oracle usasse uma comparação com preenchimento de espaços (blank-padded comparison) entre VARCHAR2 e CHAR, o que não é o caso quando um dos tipos é VARCHAR2.
(B) Incorreta: Em PL/SQL e SQL, strings literais são delimitadas por aspas simples (' '). Aspas duplas (" ") são usadas para identificadores (nomes de tabelas, colunas, etc.) que precisam ser sensíveis a maiúsculas/minúsculas ou contêm caracteres especiais.
(C) Incorreta: O Oracle é capaz de realizar comparações entre CHAR e VARCHAR2 sem gerar um erro, aplicando regras específicas de conversão e comparação. Não há erro de tipo aqui.
(D) Incorreta: O comando correto para imprimir saída no console em PL/SQL é DBMS_OUTPUT.PUT_LINE. A alternativa apresenta um erro de digitação (DBMS_OUTPUT_LINE).
(E) Correta:

  1. nome1 VARCHAR2(10) := 'TRT11R'; armazena a string 'TRT11R' (comprimento 6).
  2. nome2 CHAR(10) := 'TRT11R'; armazena a string 'TRT11R ' (comprimento 10, preenchida com 4 espaços em branco à direita para atingir o comprimento fixo de 10).
  3. Quando o Oracle compara um VARCHAR2 com um CHAR, ele usa uma comparação não preenchida com espaços (non-padded comparison). Isso significa que os espaços em branco no final são considerados parte da string.
  4. Portanto, 'TRT11R' é diferente de 'TRT11R '.
  5. A condição IF nome1 = nome2 será avaliada como falsa.
  6. O bloco ELSE será executado, imprimindo nome2 || ' diferente de ' || nome1.
  7. DBMS_OUTPUT.PUT_LINE geralmente trunca espaços em branco finais de variáveis CHAR ao exibi-las, fazendo com que nome2 seja exibido como "TRT11R" na saída, resultando em "TRT11R diferente de TRT11R".
    Armadilha da banca: A principal armadilha é pensar que o Oracle sempre realiza uma "blank-padded comparison" (comparação com preenchimento de espaços) quando compara CHAR e VARCHAR2. Essa regra só se aplica se ambos os valores forem do tipo CHAR. Se um dos valores for VARCHAR2, a comparação é "non-padded", e os espaços em branco finais fazem diferença.

Fonte: FCC TRT-11 2017 Técnico Judiciário – Área Apoio Especializado – Especialidade: Tecnologia da Informação (Caderno Tipo 001). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho