Engenharia Múltipla Escolha

Considerando a seguinte função: Qual dos seguintes códigos funcionará?

Considerando a seguinte função:

CREATE OR REPLACE FUNCTION get_avg_sal (p_dept_id number) RETURN number AS
v_avg_sal number;
BEGIN
    SELECT avg(salary) INTO v_avg_sal FROM employees WHERE department_id = p_dept_id;
    UPDATE func_usages SET number_of_usage = number_of_usage+1;
    RETURN v_avg_sal;
END;

Qual dos seguintes códigos funcionará?

  1. SELECT get_avg_sal(50) FROM dual;
  2. SELECT get_avg_sal('50') FROM dual;
  3. SELECT get_avg_sal(sysdate-hire_date) FROM employees WHERE employee_id = 100;
  4. None of them will work

Resolução completa

Explicação passo a passo

D
Alternativa D

Alternativa D

A resposta correta é que nenhuma das opções funcionará adequadamente.

Análise do Código

Para entender o erro, precisamos analisar tanto a definição da função quanto a forma como ela está sendo chamada nas alternativas:

  1. Conteúdo da Função: A função get_avg_sal contém um comando UPDATE (linha 5):
    UPDATE func_usages SET number_of_usage = number_of_usage+1;

Isso caracteriza uma manipulação de dados (DML) dentro de uma função.

  1. Regra do Oracle: No banco de dados Oracle, funções invocadas diretamente por instruções SQL (como SELECT ... FROM ...) não podem conter comandos que modifiquem o estado do banco de dados (DML como INSERT, UPDATE, DELETE). Isso ocorre para evitar efeitos colaterais e inconsistências durante a execução de consultas.

Por que as outras opções falham?

Embora os tipos de dados pareçam compatíveis, o contexto de execução impede o funcionamento:

  • Opção A: SELECT get_avg_sal(50) FROM dual;
  • O parâmetro recebe um número válido (50).
  • Falha: Tenta executar uma consulta SQL (SELECT) que chama uma função contendo UPDATE. Isso gera erro de restrição de transação.
  • Opção B: SELECT get_avg_sal('50') FROM dual;
  • O parâmetro recebe uma string ('50').
  • Conversão: O Oracle realiza conversão implícita de string para número com sucesso.
  • Falha: Mesmo com o tipo correto após conversão, a chamada via SELECT ainda enfrenta a proibição de executar UPDATE dentro da função.
  • Opção C: SELECT get_avg_sal(sysdate-hire_date) FROM employees WHERE employee_id = 100;
  • A expressão sysdate - hire_date retorna um número (dias).
  • Falha: Além do problema da DML, chamar uma função que seleciona da mesma tabela (employees) onde a consulta externa também seleciona pode causar erros de "tabela mutante" (mutating table error) dependendo do escopo.

Conclusão

Como todas as opções tentam invocar a função através de um comando SELECT em um ambiente onde a função realiza atualizações de dados, elas violam as regras de segurança transacional do Oracle. Portanto, a única resposta tecnicamente válida é que nenhuma delas funcionará.

Tem outra questão para resolver?

Resolver agora com IA

Mais questões de Engenharia

Ver mais Engenharia resolvidas

Tem outra questão de Engenharia?

Cole o enunciado, tire uma foto ou descreva o problema — a IA resolve com explicação completa em segundos.