Pular para o conteúdo principal

Questão de Banco de Dados — PL-SQL — FCC 2017

Banco de DadosPL-SQL
Código
fc037748
Banca
FCC
Órgão
TRE-PR
Ano
2017
Nível
Superior
Cargo
Analista Judiciário - Análise de Sistemas
Considere a existência de um procedure escrito em PL/SQL denominado verifica_votacao, que aceita dois parâmetros: um para a string do ID do candidato e outro para o número de votos obtidos em uma eleição.CREATE OR REPLACE PROCEDURE verifica_votacao(id_do_cand NUMBER, num_vot_cand NUMBER) IS /* implementação do restante do procedure */Um DBA Oracle criou um trigger verifica_votacao_trg na tabela candidatos que é acionado antes de uma operação INSERT ou UPDATE. Em cada linha o trigger deve chamar o procedure verifica_votacao para executar a lógica de negócios e deve especificar o novo ID de candidato e o novo número de votos para os parâmetros do procedure.CREATE OR REPLACE TRIGGER verifica_votacao_trg...I ... INSERT OR UPDATE OF id_cand, num_votON candidatosFOR EACH ROWBEGINverifica_votacao(..II ..);END;/SHOW ERRORSAs lacunas I e II devem ser preenchidas, correta e respectivamente, por
  1. AINSTEAD OF − id_cand, num_vot
  2. BINSTEAD OF − new.id_cand, new.num_vot
  3. CPRIOR − :new.id_cand, :new.num_vot
  4. DBEFORE − new id_cand, new num_vot
  5. EBEFORE − :new.id_cand, :new.num_vot
Revelar gabarito e comentário

GabaritoE — BEFORE − :new.id_cand, :new.num_vot

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”.

Trigger PL/SQL no Oracle: Sintaxe BEFORE e Referência :NEW

Gabarito: letra E. A trigger é do tipo BEFORE (acionada antes do INSERT ou UPDATE) e, para acessar os novos valores em uma trigger de nível de linha (FOR EACH ROW), utiliza-se o prefixo :NEW seguido do nome da coluna. Portanto, o preenchimento correto é BEFORE na lacuna I e :new.id_cand, :new.num_vot na lacuna II.

A banca testa o conhecimento da sintaxe de triggers Oracle, especialmente:

  • O momento de disparo: BEFORE (antes do evento), AFTER (depois) ou INSTEAD OF (no lugar, usado em views).

  • A referência a valores de linha: :NEW para o novo valor (INSERT/UPDATE) e :OLD para o antigo (UPDATE/DELETE).

Alternativa A — ❌ Incorreta

INSTEAD OF não é válido para tabelas comuns (apenas para views). Além disso, faltou o prefixo : nos nomes das colunas (id_cand em vez de :new.id_cand).

Alternativa B — ❌ Incorreta

Continua usando INSTEAD OF, que é inadequado. Embora traga new.id_cand, falta o : — a sintaxe correta é :new.id_cand, com o prefixo obrigatório para variáveis de trigger.

Alternativa C — ❌ Incorreta

PRIOR é um operador usado em consultas hierárquicas (com CONNECT BY), não é uma cláusula de momento de trigger. Apesar de :new.id_cand, :new.num_vot estar correto, o momento está errado.

Alternativa D — ❌ Incorreta

BEFORE está correto quanto ao momento, mas a referência às colunas está sem o prefixo : (new id_cand em vez de :new.id_cand). No Oracle, o prefixo é obrigatório para acessar os valores :NEW e :OLD.

Alternativa E — ✅ Correta ⟵ GABARITO

BEFORE + :new.id_cand, :new.num_vot. A sintaxe atende exatamente ao que o enunciado pede: trigger acionada antes de INSERT/UPDATE, e os parâmetros do procedure recebem os novos valores da linha sendo inserida/atualizada.

Gabarito: letra E.

Link permanente: /questoes/fc037748