Questão nº 67

Questão de Tecnologia da Informação · FGV TJ-AP 2024 (nº 67)

FGV2024Analista Judiciário - TI - Banco de DadosTecnologia da Informação
Gabarito: Cver comentário ↓

Observe o seguinte script de criação da tabela “Empresa” e outros objetos em Oracle:

```
CREATE TABLE empresa (
empresa_ID NUMBER(12) PRIMARY KEY,
razao_social VARCHAR2(50) NOT NULL
);
CREATE SEQUENCE sq_empresa_pk
START WITH 2
INCREMENT BY 2
NOMAXVALUE
NOCACHE
NOCYCLE;
CREATE OR REPLACE TRIGGER trg_bi_empresa
BEFORE INSERT ON empresa
FOR EACH ROW WHEN (NEW.empresa_ID IS NULL)
BEGIN
SELECT sq_empresa_pk.NEXTVAL INTO :NEW.empresa_ID FROM dual;
END;
```

Após a execução do script anteriormente apresentado, analise a execução dos seguintes comandos:

```
INSERT INTO empresa (empresa_ID, razao_social) VALUES (NULL, 'AAA');
INSERT INTO empresa (razao_social) VALUES ('BBB');
INSERT INTO empresa (empresa_ID, razao_social) VALUES (1, 'CCC');
INSERT INTO empresa (empresa_ID, razao_social) VALUES (5, 'DDD');
INSERT INTO empresa (empresa_ID, razao_social) VALUES (6, 'EEE');
INSERT INTO empresa (razao_social) VALUES ('FFF');
COMMIT;
```

Após a execução dos comandos apresentados, é correto afirmar que:

Resposta comentada

Gabarito Alternativa C

Um trigger é um código que executa automaticamente em resposta a um evento (como inserir dados) em uma tabela, e uma sequence é um gerador de números únicos e sequenciais, muito usado para chaves primárias. Neste caso, o trigger usa a sequence para preencher a chave primária (empresa_ID) apenas quando ela não é fornecida (é NULL) na inserção.

Análise detalhada:

  1. INSERT INTO empresa (empresa_ID, razao_social) VALUES (NULL, 'AAA');

    • empresa_ID é NULL, então o trigger trg_bi_empresa é acionado.
    • sq_empresa_pk.NEXTVAL é chamado. A sequence gera 2.
    • empresa_ID se torna 2. Linha inserida: (2, 'AAA').
    • sq_empresa_pk.CURRVAL agora é 2. (1 linha inserida)
  2. INSERT INTO empresa (razao_social) VALUES ('BBB');

    • empresa_ID é implicitamente NULL, o trigger é acionado.
    • sq_empresa_pk.NEXTVAL é chamado. A sequence gera 4 (2 + 2).
    • empresa_ID se torna 4. Linha inserida: (4, 'BBB').
    • sq_empresa_pk.CURRVAL agora é 4. (2 linhas inseridas)
  3. INSERT INTO empresa (empresa_ID, razao_social) VALUES (1, 'CCC');

    • empresa_ID é 1 (não é NULL), o trigger não é acionado.
    • Linha inserida: (1, 'CCC').
    • sq_empresa_pk.CURRVAL permanece 4. (3 linhas inseridas)
  4. INSERT INTO empresa (empresa_ID, razao_social) VALUES (5, 'DDD');

    • empresa_ID é 5 (não é NULL), o trigger não é acionado.
    • Linha inserida: (5, 'DDD').
    • sq_empresa_pk.CURRVAL permanece 4. (4 linhas inseridas)
  5. INSERT INTO empresa (empresa_ID, razao_social) VALUES (6, 'EEE');

    • empresa_ID é 6 (não é NULL), o trigger não é acionado.
    • Linha inserida: (6, 'EEE').
    • sq_empresa_pk.CURRVAL permanece 4. (5 linhas inseridas)
  6. INSERT INTO empresa (razao_social) VALUES ('FFF');

    • empresa_ID é implicitamente NULL, o trigger é acionado.
    • sq_empresa_pk.NEXTVAL é chamado. A sequence gera 6 (4 + 2).
    • empresa_ID se torna 6.
    • ERRO: Já existe uma linha com empresa_ID = 6 (a inserida no passo 5), e empresa_ID é uma chave primária (PRIMARY KEY). Esta inserção falha devido à violação da restrição de unicidade.
    • Importante: Mesmo que a inserção falhe, a chamada a NEXTVAL já ocorreu e incrementou a sequence.
    • sq_empresa_pk.CURRVAL agora é 6. (Ainda 5 linhas inseridas, pois a última falhou)
  7. COMMIT;

    • Confirma as 5 inserções bem-sucedidas.

Resultado final:

  • Foram inseridas 5 linhas.

  • O valor final de sq_empresa_pk.CURRVAL é 6.

  • (A) Incorreta: Foram inseridas 5 linhas, não 6. A última inserção falhou.

  • (B) Incorreta: Foram inseridas 5 linhas, não nenhuma. O CURRVAL final é 6.

  • (C) Correta: Foram inseridas 5 (cinco) linhas e o número final para sq_empresa_pk.CURRVAL é igual a 6 (seis);

  • (D) Incorreta: Foram inseridas 5 linhas, mas o sq_empresa_pk.CURRVAL final é 6, não 4. A armadilha aqui é pensar que NEXTVAL só incrementa a sequência se a inserção for bem-sucedida. No Oracle, NEXTVAL incrementa a sequência independentemente do sucesso ou falha da transação ou da instrução INSERT que o chamou.

  • (E) Incorreta: Foram inseridas 5 linhas, não 4, e o CURRVAL final é 6.

Fonte: FGV TJ-AP 2024 Analista Judiciário - TI - Banco de Dados (Caderno Tipo 1). 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