Escolar Documentos
Profissional Documentos
Cultura Documentos
br
learningdatabase.com.br
02/05/2018
RODRIGOSAITO
MANIPULANDO EXCEÇÕES
Quando desenvolvemos procedures que são chamadas de outras procedures, devemos ter
ciência dos processamentos e exceções de não processamento nas transações e chamadas
de procedures;
Quando uma exceção é levantada na chamada de uma procedure, o controle vai
imediatamente para a seção de exceção daquele bloco.
Uma exceção é considera processada se a exceção fornece um manipulador para a exceção
levantada;
Quando uma exceção ocorre e é manipulada, o seguinte fluxo de código ocorre:
A exceção é erguida/levantada;
O controle é transferido para o manipulador de exceção;
O bloco é terminado;
O bloco/programa chamador continua a executar como se nada tivesse acontecido;
EXEMPLO
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 1/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
–VERIFICANDO DADOS
EXECUTE CREATE_DEPARTMENTS;
SELECT EMPLOYEE_ID
FROM EMPLOYEES
WHERE EMPLOYEE_ID IN (100,99,101);
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 2/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
MANIPULANDO EXCEÇÕES
EXEMPLO
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 3/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
–CHAMADA DA PROCEDURE NOEX
EXECUTE create_departments_noex;
Perceba que neste último exemplo, sem o tratamento de exceção, uma única linha não
consistente não deixou que as demais linhas fossem incluídas na tabela;
EXCLUSÃO DE PROCEDURES
VISUALIZANDO INFORMAÇÕES DE
PROCEDURES UTILIZANDO DICIONARIO DE
DADOS DAS VIEWS
DESCRIBE USER_SOURCE;
DESCRIBE ALL_SOURCE;
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 4/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
LOOPS (LAÇOS)
–LOOPS BASICO
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 5/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
DESCRIBE DEPARTMENTS;
DECLARE
v_max_department_id number;
v_novo_departamento departments.department_name%TYPE;
v_contador number := 1;
BEGIN
SELECT MAX(DEPARTMENT_ID)
INTO v_max_department_id
FROM DEPARTMENTS;
v_novo_departamento := '&NovoDepto';
LOOP
v_novo_departamento := v_novo_departamento || v_contador;
v_contador := v_contador + 1;
–VERIFIQUE OS RESULTADOS
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 6/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
DECLARE
v_max_department_id number;
v_novo_departamento departments.department_name%TYPE;
v_contador number := 1;
BEGIN
SELECT MAX(DEPARTMENT_ID)
INTO v_max_department_id
FROM DEPARTMENTS;
v_novo_departamento := '&NovoDepto';
–VERIFIQUE OS RESULTADOS
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 7/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
DECLARE
v_max_department_id number;
v_novo_departamento departments.department_name%TYPE;
v_contador number := 1;
BEGIN
SELECT MAX(DEPARTMENT_ID)
INTO v_max_department_id
FROM DEPARTMENTS;
v_novo_departamento := '&NovoDepto';
v_contador := v_contador + 1;
END LOOP;
END;
/
–VERIFIQUE OS RESULTADOS
INSTRUÇÃO CONTINUE
EXEMPLO DE CONTINUE
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 8/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
DATATYPE
Datatypes são tipo de dados que possuem múltiplos valores, ou seja, pode-se armazenar
vários dados em uma única variável, que ao contrário do tipos char, number, date, podem
armazenar somente 1 por vez;
Podem ser do tipos RECORD e COLLECTION;
RECORDS e COLLECTIONS
RECORD é quando queremos armazenar um valor com diferentes tipos de dados em uma
única ocorrência naquele momento;
COLLECTION é quando queremos armazenar alguns valores do mesmo tipo de dado
(record);
ESTRUTURA DE UM RECORD
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 9/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
ATRIBUTO %ROWTYPE
Declara uma variável de acordo com uma coleção de colunas de uma tabela uma view;
Campos de um RECORD tem que ter mesmos nomes e tipos de colunas de uma tabela ou
view;
EXEMPLO DE %ROWTYPE
SELECT *
INTO v_meurec.v_emp1
FROM employees
WHERE EMPLOYEE_ID = 100;
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 10/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
CURSORES
Toda instrução SQL que é executada no Servidor Oracle é associado um cursor individual;
Cursor implícito é declarado e gerenciado pelo PL/SQL;
Cursor explícito é declarado e gerenciado pelo programador;
CURSORES EXPLICITOS
DECLARANDO CURSORES
Não incluir INTO na declaração do cursor, pois o carregamento dos valores será feita após o
FETCH;
Caso queira que seja processado em uma determinada sequencia, utilize ORDER BY;
Um cursor pode suportar SELECTs com JOINS;
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 11/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
LOOP
FETCH c_emp_cursor INTO v_empno, v_lname;
CLOSE c_emp_cursor ;
END;
/
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 12/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
STATUS DE CURSORES
UTILIZAÇÃO DO %ISOPEN
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 13/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
LOOP
FETCH c_emp_cursor INTO v_empno, v_lname;
EXIT WHEN c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_lname);
END LOOP;
END;
/
UTILIZAÇÃO DO %ROWCOUNT e
%NOTFOUND
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 14/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
c_emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_record.employee_id
|| ' ' || v_emp_record.last_name);
END LOOP;
CLOSE c_emp_cursor;
END;
/
FUNÇÕES
PROCEDURES FUNCTIONS
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 15/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
Executa como declaração PL/SQL Chamado com uma parte de uma expressão
Não contém cláusula RETURN no cabeçalho Precisa conter um RETURN no cabeçalho
Pode passar valores (se precisar) usando
Precisa retornar um valor simples
parâmetros output
Pode conter a declaração RETURN sem um Precisa conter ao menos uma declaração
valor RETURN
–CRIANDO A FUNÇÃO
RETURN v_sal;
END get_sal;
/
EXECUTE dbms_output.put_line(get_sal(100));
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 16/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
–EXEMPLO 1
PRINT b_salary;
–EXEMPLO 2
SET SERVEROUTPUT ON
DECLARE
sal employees.salary%TYPE;
BEGIN
sal := get_sal(100);
DBMS_OUTPUT.PUT_LINE('o SALÁRIO É: ' || sal);
END;
/
–EXEMPLO 3
–EXEMPLO 4
Podemos utilizar a tabela USER_OBJECTS para identificar os tipos de objetos que o usuário
corrente tem acesso;
SELECT object_name,
object_type
FROM user_objects;
SELECT avg(salary)
INTO v_avg_sal
FROM employees
WHERE department_id = v_dept_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END;
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 18/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
LINE/COL ERROR
-------- ----------------------------------
9/3 PL/SQL: SQL Statement ignored
11/3 PL/SQL: ORA-00936: missing expression
AJUSTE DA FUNÇÃO
SELECT salary,
department_id
INTO v_sal,
v_dept_id
CHAMADA DA FUNÇÃO
–chamada da função
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 19/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 20/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
SELECT avg(salary)
INTO v_avg_sal
FROM employees
WHERE department_id = v_dept_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END;
/
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 21/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
Exercícios
1. Crie uma função, que passado 2 parâmetros do tipo number, (o valor do primeiro parâmetro
deve ser menor que o segundo) retorne o valor do maior salário encontrado. Os parâmetros
passados são correspondentes aos códigos dos empregados. Essa função deve tratar erro,
caso o primeiro parâmetro seja maior que o segundo parâmetro. No ambiente chamador,
mostre o valor encontrado;
2. Crie uma função, que passado um parâmetro do tipo number e outro do tipo data, que
retorne a quantidade de tempo que o empregado está na empresa em anos que o valor
deve ser arredondado. Os parâmetros passados são correspondentes ao códigos do
empregados e a data de admissão. No ambiente chamador, deve-se chamar a função
através de um comando select;
3. Crie uma função, que passado um parâmetro do tipo number, retorne se o funcionário tem
o job_id igual a “IT_PROG” ou “PU_CLERCK”. O parâmetro passado é correspondente ao
código do funcionário. No ambiente chamador, deve ser impresso se o funcionário tem ou
não tem o job_id igual a “IT_PROG” ou “PU_CLERCK”;
4. Crie uma função, que passado um parâmetro do tipo number, retorne a quantidade de
funcionário que existem em um determinado departamento. O parâmetro passado é
correspondente ao departamento. No ambiente chamador, é necessário estar impresso o
código do departamento e a quantidade de funcionários;
Vídeo – Parte 1
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 22/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
Vídeo – Parte 2
Vídeo – Parte 3
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 23/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 24/25
02/02/2019 Banco de Dados II – Aula 12 – learningdatabase.com.br
Anúncios
REPORT THIS AD
REPORT THIS AD
DESENVOLVIMENTO EM BANCO DE DADOS ORACLE PL/SQL
WordPress.com.
https://learningdatabase.com.br/2018/05/02/banco-de-dados-ii-aula-12/ 25/25