Buscar

PlSql Avançado

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 29 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 29 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 29 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

PL SQL
Avançado
https://www.techonthenet.com/oracle/exists.php
https://docs.oracle.com/cd/B10500_01/appdev.920/a96624/05_colls.htm
http://www.oracle.com/technetwork/issue-archive/2013/13-mar/o23plsql-1906474.html
PL SQL - Avançado
Objetivo:
Pré requisito: Conceitos Intermediários.
Possuir familiaridade com conceitos avançados
PL SQL
EXCEÇÕES DO SISTEMA
COLLECTIONS AND RECORDS
CURSORES
SEQUENCES
TRIGGERS
PROCEDURES
FUNCTIONS
PACKAGES
EXCEÇÕES DO SISTEMA
As exceções de sistema são exceções que possuem nomes pré-definidos no Oracle PL/SQL. Elas são nomeadas no pacote STANDARD do PL/SQL e não precisam ser definidos pelo programador.
EXCEÇÕES DO SISTEMA
Oracle Exception Name
Oracle Error
Explanation
DUP_VAL_ON_INDEX
ORA-00001
Você tentou executar uma instrução INSERT ou UPDATE que criou um valor duplicado em um campo restrito por um índice exclusivo.
INVALID_CURSOR
ORA-01001
You tried to reference a cursor that does not yet exist. This may have happened because you've executed a FETCH cursor or CLOSE cursor before OPENing the cursor.
NOT_LOGGED_ON
ORA-01012
Você tentou executar uma chamada para o Oracle antes de iniciar sessão.
LOGIN_DENIED
ORA-01017
Você tentou se conectar ao Oracle com uma combinação inválida de nome de usuário / senha.
NO_DATA_FOUND
ORA-01403
Você tentou um dos seguintes procedimentos:
1. Você executou uma instrução SELECT INTO e nenhuma linha foi retornada.
2. Você referenciou uma linha não inicializada em uma tabela.
3. Você lê após o final do arquivo com o pacote UTL_FILE.
TOO_MANY_ROWS
ORA-01422
Você tentou executar uma instrução SELECT INTO e mais de uma linha foi retornada.
ZERO_DIVIDE
ORA-01476
Você tentou dividir um número por zero.
INVALID_NUMBER
ORA-01722
Você tentou executar uma instrução SQL que tentou converter uma string para um número, mas não teve êxito.
EXCEÇÕES DO SISTEMA
CREATE [OR REPLACE] PROCEDURE procedure_name
 [ (parameter [,parameter]) ]
IS
 [declaration_section]
BEGIN
 executable_section
EXCEPTION
 WHEN exception_name1 THEN
 [statements]
 WHEN exception_name2 THEN
 [statements]
 WHEN exception_name_n THEN
 [statements]
 WHEN OTHERS THEN
 [statements]
END [procedure_name];
COLLECTIONS AND RECORDS
PL / SQL fornece os tipos de dados TABLE e VARRAY, que permitem que você declare “Index-By Table (matrizes associativas)”, “Nested tables Tabelas Aninhadas” e “VARRAY Matrizes de Tamanho Variável”.
Também pode ser criado o tipo de dados RECORD que permite tratar dados relacionados.
Index-By Table
Permitem pesquisar elementos usando números arbitrários – Ordenado pelo VARCHAR “ordem alfabética”
DECLARE
 TYPE population_type IS TABLE OF NUMBER INDEX BY VARCHAR2(64);
 country_population population_type;
 continent_population population_type;
 populacao NUMBER;
 continente VARCHAR2(64);
BEGIN
 country_population('Greenland') := 100000;
 country_population('Iceland') := 750000;
 populacao := country_population('Greenland');
 continent_population('Australia') := 30000000;
 continent_population('Antarctica') := 1000; -- Creates new entry
 continent_population('Antarctica') := 1001; -- Replaces previous value
 continente := continent_population.FIRST; -- Returns 'Antarctica' primeiro alfabeticamente.
 continente := continent_population.LAST; -- Returns 'Australia'
 populacao := continent_population(continent_population.LAST); -- Returns the value corresponding 
 -- to the last key, in this case the population of Australia.
END;
VARRAY - MATRIZES DE TAMANHO VARIÁVEL
Varrays (abreviação de matrizes de tamanho variável). Mantêm um número fixo de elementos (embora você possa alterar o número de elementos em tempo de execução), “sem passar o valor máximo fixado”. 
VARRAY - MATRIZES DE TAMANHO VARIÁVEL
DECLARE
	 TYPE typeArrayNumeros IS VARRAY(5) OF NUMBER(10);
	 colecao typeArrayNumeros;
	 indice NUMBER;
 BEGIN
	-- Inicializando a colecao com 2 valores
	colecao := typeArrayNumeros(1, 2);
	-- Ampliar a colecao com valores extras
	<<load_loop>>
	FOR i IN 3 .. 5 LOOP
	 colecao.extend;
	 colecao(colecao.last) := i;
	END LOOP load_loop;
	-- Nao e possível excluir de um VARRAY. “ colecao.DELETE(3); ”
	-- Percorrer a colecao – “POSICAO DO PRIMEIRO ELEMENTO”  1  
	indice := colecao.FIRST;
	<<display_loop>>
	WHILE indice IS NOT NULL LOOP
	 DBMS_OUTPUT.PUT_LINE('Numero = ' || colecao(indice));
	 indice := colecao.NEXT(indice);
	END LOOP display_loop;
 END;
NESTED TABLES - TABELAS ANINHADAS 
Dentro do banco de dados, as tabelas aninhadas podem ser consideradas tabelas de banco de dados de uma coluna. O Oracle armazena as linhas de uma tabela aninhada sem nenhuma ordem específica. Mas, quando você recupera a tabela aninhada em uma variável PL / SQL, as linhas recebem subíndices consecutivos a partir de 1.
NESTED TABLES - TABELAS ANINHADAS 
Para tabelas aninhadas, use a sintaxe:
TYPE type_name IS TABLE OF element_type [NOT NULL];
	Obs: NOT NULL “Opcional”
NESTED TABLES - TABELAS ANINHADAS 
	DECLARE
		TYPE Roster IS TABLE OF VARCHAR2(15) not null;
		names Roster := Roster('J Hamil',
					'D Caruso',
					'R Singh',
					'PL SQL',
					'Nomes');
	BEGIN
	FOR i IN names.FIRST .. names.LAST LOOP
	 dbms_output.put_line(' names(' || i || ') ' || names(i));
	 IF names(i) = 'J Hamil' THEN
	 NULL;
	 END IF;
	END LOOP;
	END;
RECORDS 
Um registro é uma estrutura de dados que pode armazenar itens de dados de diferentes tipos. Os registros consistem em diferentes campos, semelhante a uma linha de uma tabela de banco de dados.
RECORDS 
DECLARE
 TYPE recType_Produto IS RECORD(
 idProduto PROD_JD.SN_PRODUTO.ID_PRODUTO%TYPE,
 descricao PROD_JD.SN_PRODUTO.DESCRICAO%TYPE);
 lstProduto recType_Produto;
 CURSOR busca_prod_cursor IS
 select id_produto, descricao
 from PROD_JD.SN_PRODUTO
 where id_produto in (5012, 5009, 5010, 5011)
 order by id_produto asc;
BEGIN
 OPEN busca_prod_cursor;
 LOOP
 
 FETCH busca_prod_cursor
 INTO lstProduto;
 EXIT WHEN busca_prod_cursor%NOTFOUND;
 
 DBMS_OUTPUT.PUT_LINE('ID: '||lstProduto.idProduto);
 
 END LOOP;
 IF busca_prod_cursor%ISOPEN THEN
 CLOSE busca_prod_cursor;
 END IF;
END;
CURSORES
Um cursor é uma instrução SELECT que está definida dentro da seção de declaração do seu código PLSQL. 
Cursor sem parâmetros. (mais simples)
Cursor com parâmetros.
	
CURSORES - Cursor sem parâmetros
Function FindCourse(pIdProduto IN NUMBER) RETURN number IS
	vIdProduto number;
	CURSOR c1 IS
	SELECT id_produto FROM sn_produto WHERE id_produto = pIdProduto;
BEGIN
 	 OPEN c1;
	 FETCH c1
	 INTO vIdProduto;
	if c1%notfound then
	 vIdProduto := 9999;
	end if;
	
	CLOSE c1;
	
	RETURN vIdProduto;
 END;
CURSORES - Cursor com parâmetro
Declaração:
	
	CURSOR c1 (pIdProdursor NUMBER) IS
	 SELECT id_produto FROM sn_produto WHERE id_produto = pIdProdursor;
Uso:
	 OPEN c1 (pIdProduto);
	 FETCH c1
	 INTO vIdProduto;
SEQUENCES
No Oracle, você pode criar um campo autonumérico usando sequências. Uma sequência é um objeto no Oracle que é usado para gerar uma sequência de números. Isso pode ser útil quando você precisa criar um número exclusivo para atuar como uma chave primária.
SEQUENCES
Criando:
CREATE SEQUENCE supplier_seq
 MINVALUE 0
 MAXVALUE 999999999999999999999999999
 START WITH 0
 INCREMENT BY 1
 CACHE 2;
TRIGGERS - AFTER DELETE
Uma trigger AFTER DELETE significa que a Oracle disparará a trigger depois que uma operação DELETE for executada.
TRIGGERS - AFTER DELETE
CREATE OR REPLACE TRIGGER tr_after_del_pedido
	AFTER DELETE
	 ON tb_pedido
	 FOR EACH ROW
 DECLARE
		v_username varchar2(10);
 BEGIN
	-- Find username of person performing the DELETE on the tableSELECT user INTO v_username FROM dual;
	INSERT INTO log_pedido ( id_pedido, custo_total, data_acao, deletado_por)
	 VALUES ( :old.id_pedido, :old.custo_total, sysdate, v_username );
	END;
TRIGGERS - AFTER INSERT
Uma trigger AFTER INSERT significa que a Oracle disparará a trigger depois que a operação INSERT for executada.
TRIGGERS - AFTER INSERT
CREATE OR REPLACE TRIGGER tr_after_ins_pedido
	AFTER INSERT
	 ON tb_pedido
	 FOR EACH ROW
	DECLARE
	.
	.
	.
	INSERT INTO auditoria_pedido
		( order_id, total_cost, username )
	VALUES ( :new.order_id, :new.total_cost, v_username );
TRIGGERS - AFTER UPDATE
Uma trigger AFTER UPDATE significa que a Oracle disparará a trigger depois que a operação UPDATE for executada.
TRIGGERS - AFTER UPDATE
CREATE OR REPLACE TRIGGER tr_after_upd_pedido
	AFTER UPDATE
	 ON tb_pedido
	 FOR EACH ROW
	DECLARE
	.
	.
	.
	INSERT INTO auditoria_pedido
	(order_id, quantity_before, quantity_after, username)
	VALUES (:new.order_id, :old.quantity, :new.quantity, v_username);
TRIGGERS – BEFORE – DEL, INS e UPD
BEFORE DELETE
BEFORE INSERT
BEFORE UPDATE
PROCEDURES
Assim como em outras linguagens, você pode criar suas próprias Procedures Oracle.
CREATE [OR REPLACE] PROCEDURE procedure_name
	 [ (parameter [,parameter]) ]
 IS
	 [declaration_section]
 BEGIN
	 executable_section
 [EXCEPTION
	 exception_section]
 END [procedure_name]; 
IN – Parâmetro de entrada da procedure.
OUT - Parâmetro de saída da procedure.
IN OUT - Parâmetro de entrada e saída da procedure.
FUNCTIONS
Assim como em outras linguagens, você pode criar suas próprias Functions Oracle.
CREATE [OR REPLACE] FUNCTION function_name
	 [ (parameter [,parameter]) ]
	 RETURN return_datatype
 IS | AS
	 [declaration_section]
 BEGIN
	 executable_section
	 return xxxxx;
 [EXCEPTION
	 exception_section]
 END [function_name];
IN – Não obrigatório, Parâmetro de entrada da procedure.
OUT – Não pode ser utilizado em uma função.
IN OUT - Não pode ser utilizado em uma função.

Outros materiais