Questão nº 67
Questão de Tecnologia da Informação · FGV TJ-AP 2024 (nº 67)
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:
- Aforam inseridas 6 (seis) linhas e o número final para sq_empresa_pk.CURRVAL é igual a 6 (seis);
- Bnenhuma linha pode ser inserida e o número final para sq_empresa_pk.CURRVAL é igual a 2 (dois);
- Cforam inseridas 5 (cinco) linhas e o número final para sq_empresa_pk.CURRVAL é igual a 6 (seis); (alternativa correta)
- Dforam inseridas 5 (cinco) linhas e o número final para sq_empresa_pk.CURRVAL é igual a 4 (quatro);
- Eforam inseridas 4 (quatro) linhas e o número final para sq_empresa_pk.CURRVAL é igual a 4 (quatro).
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:
-
INSERT INTO empresa (empresa_ID, razao_social) VALUES (NULL, 'AAA');empresa_IDéNULL, então o triggertrg_bi_empresaé acionado.sq_empresa_pk.NEXTVALé chamado. A sequence gera 2.empresa_IDse torna 2. Linha inserida:(2, 'AAA').sq_empresa_pk.CURRVALagora é 2. (1 linha inserida)
-
INSERT INTO empresa (razao_social) VALUES ('BBB');empresa_IDé implicitamenteNULL, o trigger é acionado.sq_empresa_pk.NEXTVALé chamado. A sequence gera 4 (2 + 2).empresa_IDse torna 4. Linha inserida:(4, 'BBB').sq_empresa_pk.CURRVALagora é 4. (2 linhas inseridas)
-
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.CURRVALpermanece 4. (3 linhas inseridas)
-
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.CURRVALpermanece 4. (4 linhas inseridas)
-
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.CURRVALpermanece 4. (5 linhas inseridas)
-
INSERT INTO empresa (razao_social) VALUES ('FFF');empresa_IDé implicitamenteNULL, o trigger é acionado.sq_empresa_pk.NEXTVALé chamado. A sequence gera 6 (4 + 2).empresa_IDse torna 6.- ERRO: Já existe uma linha com
empresa_ID = 6(a inserida no passo 5), eempresa_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
NEXTVALjá ocorreu e incrementou a sequence. sq_empresa_pk.CURRVALagora é 6. (Ainda 5 linhas inseridas, pois a última falhou)
-
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
CURRVALfinal é 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.CURRVALfinal é 6, não 4. A armadilha aqui é pensar queNEXTVALsó incrementa a sequência se a inserção for bem-sucedida. No Oracle,NEXTVALincrementa a sequência independentemente do sucesso ou falha da transação ou da instruçãoINSERTque o chamou. -
(E) Incorreta: Foram inseridas 5 linhas, não 4, e o
CURRVALfinal é 6.
Fonte: FGV TJ-AP 2024 Analista Judiciário - TI - Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.