Estou estudando PL/SQL na faculdade e o professor passou umas questões baseadas no modelo de Recursos Humanos do próprio OracleXE. A questão que estou fazendo pede uma trigger que impeça que um funcionário tenha o salário maior que o de seu chefe. E para essa trigger eu preciso de uma package com umas procedures para não dar erro de trigger mutante.
Essa foi a package que escrevi:
CREATE OR REPLACE PACKAGE BODY CONSULT_EMPLOYEE_SALARY IS PROCEDURE LIMPA_VETOR IS BEGIN idx := 0; v_tab.DELETE; END; PROCEDURE ALIMENTAR_VETOR (p_id EMPLOYEES.EMPLOYEE_ID%TYPE, p_salary EMPLOYEES.SALARY%TYPE, p_managerID EMPLOYEES.MANAGER_ID%TYPE) IS BEGIN idx := idx + 1; v_tab(idx).EMPLOYEE_ID := p_id; v_tab(idx).SALARY := p_salary; v_tab(idx).MANAGER_ID := p_managerID; END; PROCEDURE OBTER_VETOR (p_idx PLS_INTEGER, p_employeeID OUT EMPLOYEES.EMPLOYEE_ID%TYPE, p_salary OUT EMPLOYEES.SALARY%TYPE, p_managerID OUT EMPLOYEES.MANAGER_ID%TYPE) IS BEGIN IF v_tab.EXISTS(p_idx) THEN p_employeeID := v_tab(idx).EMPLOYEE_ID; p_salary := v_tab(idx).SALARY; p_managerID := v_tab(idx).MANAGER_ID; END IF; END; END;
E essa é a trigger que executa a procedure ALIMENTAR_VETOR:
CREATE OR REPLACE TRIGGER EMPLOYEE_AU AFTER UPDATE ON EMPLOYEES FOR EACH ROW BEGIN IF UPDATING THEN CONSULT_EMPLOYEE_SALARY.ALIMENTAR_VETOR(:OLD.EMPLOYEE_ID, :NEW.SALARY, :OLD.MANAGER_ID) ; END IF; END;
Quando testo o update ocorre o seguinte erro:
Erro a partir da linha : 249 no comando - update employees set salary = 9500 where employee_id = 104 Relatório de erros - ORA-06502: PL/SQL: erro: valor-chave de tabela de índice NULL numérico ou de valor ORA-06512: em "HR.CONSULT_EMPLOYEE_SALARY", line 12 ORA-06512: em "HR.EMPLOYEE_AU", line 3 ORA-04088: erro durante a execução do gatilho 'HR.EMPLOYEE_AU'
Eu pesquisei sobre esse erro, mas a mensagem que encontrei relacionada a esse código ORA é diferente. Isso está dizendo que estou passando um parâmetro nulo? E também estou em dúvida se é possível ter acesso a todas colunas em uma trigger after de linha usando :old.[nome-da-coluna].
Obrigado.