Questão 20 - HCPA 2020 - ANALISTA DE TI (ADMINISTRAÇÃO DE BANCO DE DADOS)
questão 20 comando Oracle 12c triggers e funções
Confira abaixo a resposta da questão sobre a criação de tabela, função e triggers e inserção de dados no Oracle Usando PL/SQL.
Considere os comandos abaixo no Oracle 12c, sequencialmente, de cima para baixo:
CREATE TABLE pacientes
(id integer,
nome varchar2(100),
sexo char(1));
create or replace function valida_paciente(p_nome varchar2, p_sexo char) return
boolean as
v_resultado integer;
begin
select count(*) into v_resultado from pacientes where nome = p_nome and sexo =
p_sexo;
if v_resultado = 1 then
return false;
else
return true;
end if;
end;
create or replace trigger trg_pacientes
before insert on pacientes for each row
begin
if not valida_paciente(nome, sexo) then
raise_application_error(-20000,'PACIENTE DUPLICADO');
end if;
end;
insert into pacientes (id, nome, sexo) values (1, 'JOAO DA SILVA', 'M');
insert into pacientes (id, nome, sexo) values (2, 'MARIA OLIVEIRA', 'F');
insert into pacientes (id, nome, sexo) values (3, 'JOSE SILVEIRA', 'M');
insert into pacientes (id, nome, sexo) values (4, 'JOAO DA SILVA', 'M');
commit;
O que ocorrerá ao se executarem os referidos comandos?
(A) Erro ao criar a tabela.
(B) Erro ao criar a function.
(C) Erro ao criar a trigger.
(D) Erro ao inserir o último registro.
(E) Todos os comandos serão executados com sucesso.
Vamos analisar cada parte dos comandos sequencialmente:
Criação da Tabela:
O comando CREATE TABLE cria uma tabela chamada "pacientes" com três colunas: "id" do tipo inteiro e "nome" e "sexo" do tipo VARCHAR2 e CHAR, respectivamente. Este comando será executado com sucesso, pois não há erros sintáticos aparentes.
Criação da Função:
O comando CREATE OR REPLACE FUNCTION cria uma função chamada "valida_paciente". Esta função recebe um nome e um sexo como parâmetros e retorna um valor booleano. No entanto, há um problema de lógica na função: ela retorna TRUE se o paciente não existe na tabela, o que contradiz a lógica esperada. A função deve retornar TRUE se o paciente não existe e FALSE se existe. Portanto, houve um erro de lógica na função.
Criação do Trigger:
A trigger não funcionará adequadamente devido a algumas questões no código e na lógica de implementação:
Parâmetros da função: Na função valida_paciente, os parâmetros p_nome e p_sexo estão sendo passados como parâmetros da função. No entanto, na chamada da função dentro da trigger trg_pacientes, os parâmetros estão sendo referenciados diretamente (valida_paciente(nome, sexo)). Isso causará um erro de compilação porque nome e sexo não estão definidos no escopo da trigger. Eles deveriam ser referenciados como :new.nome e :new.sexo, respectivamente, para indicar os valores do registro sendo inserido.
Lógica da função: A função valida_paciente retorna verdadeiro se o paciente não for duplicado e falso se for. No entanto, na trigger trg_pacientes, o condicional está invertido. O correto seria verificar se a função retorna falso, indicando que o paciente é duplicado, e então lançar o erro.
Para corrigir o problema, é necessário ajustar a lógica da função valida_paciente para retornar verdadeiro se o paciente for duplicado e falso caso contrário. Além disso, na trigger trg_pacientes, os parâmetros devem ser referenciados corretamente usando :new.nome e :new.sexo. E, por fim, o condicional na trigger deve ser invertido para capturar corretamente a situação de paciente duplicado.
Após corrigir esses problemas, a trigger será capaz de impedir a inserção de pacientes duplicados de acordo com a lógica definida na função valida_paciente.
Inserções de Dados:
Há tentativas de inserção de quatro registros na tabela "pacientes". Os três primeiros registros devem ser inseridos com sucesso. No entanto, o quarto registro tenta inserir um paciente com nome e sexo iguais a um paciente já existente na tabela. Como o trigger verificará a duplicidade e lançará um erro com raise_application_error, a inserção do quarto registro falhará.
Portanto, a resposta correta é:
De acordo com o gabarito a resposta correta é a (C) Erro ao criar a trigger.
Vamos analisar cada opção:
(A) Erro ao criar a tabela:
Essa opção está incorreta, pois não há nenhum problema aparente na criação da tabela. A tabela é definida corretamente com três colunas (id, nome e sexo).
(B) Erro ao criar a função:
A criação da função valida_paciente parece estar correta. Não há erros de sintaxe evidentes. Portanto, essa opção também está incorreta.
(C) Erro ao criar a trigger:
Esta é a resposta correta, pois a trigger tenta chamar a função valida_paciente sem referenciar corretamente os parâmetros (nome e sexo). Além disso, a lógica do condicional na trigger está invertida, o que causará um comportamento inadequado.
(D) Erro ao inserir o último registro:
Essa opção está incorreta, pois a trigger deveria impedir a inserção do último registro, devido à tentativa de inserir um paciente duplicado. Portanto, a inserção do último registro deve resultar em um erro.
(E) Todos os comandos serão executados com sucesso:
Essa opção está incorreta. A trigger está com problemas de referência de parâmetros e lógica invertida, o que resultará em um erro ao tentar inserir o último registro.
Portanto, a resposta correta é (C) Erro ao criar a trigger, pois a trigger contém erros que impedirão sua criação bem-sucedida e, consequentemente, a execução dos comandos relacionados a ela.
Qual o assunto dessa questão?
O assunto principal dessa questão está relacionado à criação e utilização de triggers em bancos de dados Oracle, bem como a interação entre triggers e funções PL/SQL. A questão aborda a sintaxe e a lógica por trás da criação de uma trigger para validar dados antes de sua inserção em uma tabela. Também envolve a compreensão do uso de funções PL/SQL dentro de triggers e a manipulação de erros durante o processo de inserção de dados. Portanto, o assunto principal é o uso de triggers e funções PL/SQL para impor regras de integridade de dados em um banco de dados Oracle.
Leia mais em: iretoaoponto-tech.com.br/conc...