1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. a) b) c) d) e) f)
CREATE OR REPLACE PROCEDURE altera_salario (
id_empregado IN employees.employee_id%TYPE, novo_salario IN employees.salary%TYPE ) IS Empregado_Invalido EXCEPTION; BEGIN UPDATE employees SET salary = novo_salario WHERE employee_id = id_empregado; IF SQL%NOTFOUND THEN RAISE Empregado_Invalido; END IF; EXCEPTION WHEN Empregado_Invalido THEN DBMS_OUTPUT.PUT_LINE('Este funcionario no existe'); END
Qual a funo do %Type na linha 2?
O que empregado_invlido na linha 5? O que testado na linha 10? Qual a funo dessa linha para o algoritmo? O que faz o RAISE da linha 11? Qual sua importncia para o algoritmo? Quando o bloco EXCEPTION localizado a partir da linha 13 ser executado? A mensagem gerada na linha 15 uma boa prtica? Por qu?
2) Transforme o procedimento da questo 1 (altera_salario) em uma funo chamada
func_altera_salario do tipo BOOLEAN que retorne FALSE em caso de exceo ou TRUE em caso de sucesso. 3) Enumere todas as possveis excees que podem ser geradas na instruo UPDATE da funo func_altera_salario da questo 2? 4) Reconstrua a funo (func_altera_salario) em uma nova funo chamada func_altera_salario_excep adicionando-lhe todos os possveis tratamentos de exceo para a operao UPDATE nela contida. 5) Crie a tabela para log de erros de aplicao chamada tab_erros conforme instruo abaixo: CREATE TABLE tab_erros ( Erro NUMBER(6), Usurio VARCHAR2(30), Date DATE ); Considere tambm o seguinte procedimento remove_depto: 1. 2. 3. 4. 5. 6. 7.
CREATE OR REPLACE PROCEDURE remove_depto (
depto IN departments.department_id%TYPE ) IS restam_empregados EXCEPTION; PRAGMA EXCEPTION_INIT(restam_empregados,-2292); qtd NUMBER := 0; BEGIN
DELETE FROM departments
8. WHERE department_id = depto; 9. IF SQL%NOTFOUND THEN 10. RAISE_APPLICATION_ERROR(-20001,'Departamento '||depto||' no existe'); 11. END IF; 12. 13. EXCEPTION WHEN restam_empregados THEN 14. SELECT COUNT(*) INTO qtd 15. FROM employees 16. WHERE department_id = depto; 17. DBMS_OUTPUT.PUT_LINE('Departamento '|| depto ||' tem '|| qtd ||' emps'); 18. 19. END;
a) Transforme o procedimento remove_depto na funo func_remove_depto que
retorna TRUE em caso de sucesso ou FALSE em caso de falha. Essa nova funo deve inserir o erro gerado pela exceo na tabela tab_erros descrita anteriormente e no emitir mensagem no console (retirar os comandos DMBS_OUTPUT.PUT_LINE). Na instruo de insero na tabela erro, utilize a funo SYSDATE para a coluna data e utilize a funo USER para a coluna usurio. 6) Considere o procedimento exclui_paises abaixo: 1. CREATE OR REPLACE PROCEDURE exclui_paises ( 2. codigo_pais IN countries.country_id%TYPE 3. ) IS; 4. BEGIN 5. DELETE countries 6. WHERE country_id = codigo_pais; 7. EXCEPTION 8. WHEN OTHERS THEN 9. DBMS_OUTPUT.PUT_LINE('Cdigo de Erro= '||SQLCODE); 10. DBMS_OUTPUT.PUT_LINE('Menagem de Erro= '||SQLERRM); 11. END; a) Na linha 9, para que serve a funo SQLCODE? b) Na linha 10, para que serve a funo SQLERRM? c) Cite 10 cdigos possveis retornados pela funo SQLCODE e suas respectivas mensagens. d) Transforme o procedimento exclui_paises na funo func_excluir_paises que retorna TRUE em caso de sucesso e FALSE em caso de exceo. Alm disso, substitua as mensagens de erro das linhas 9 e 10 por uma instruo que insira os dados do erro na tabela tab_erros descrita na questo 5. 7) Coloque todos os procedimentos e funes desta atividade num pacote com nome que julgar apropriado.