Questão nº 45
Questão de Tecnologia da Informação · FCC TRT-11 2017 (nº 45)
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,
- Aserá impresso TRT11R igual a TRT11R.
- Bocorrerá um erro, pois todos os strings deveriam estar delimitados por " " e não por ' '.
- Cocorrerá um erro, pois nome1 e nome2 são de tipos diferentes.
- Docorrerá um erro, pois o comando de saída deveria ser DBMS_OUTPUT_LINE.
- Eserá impresso TRT11R diferente de TRT11R. (alternativa correta)
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:
nome1 VARCHAR2(10) := 'TRT11R';armazena a string'TRT11R'(comprimento 6).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).- Quando o Oracle compara um
VARCHAR2com umCHAR, 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. - Portanto,
'TRT11R'é diferente de'TRT11R '. - A condição
IF nome1 = nome2será avaliada como falsa. - O bloco
ELSEserá executado, imprimindonome2 || ' diferente de ' || nome1. DBMS_OUTPUT.PUT_LINEgeralmente trunca espaços em branco finais de variáveisCHARao exibi-las, fazendo com quenome2seja 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 comparaCHAReVARCHAR2. Essa regra só se aplica se ambos os valores forem do tipoCHAR. Se um dos valores forVARCHAR2, 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.