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:
- 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.
- 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á.