A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

SCC Bancos de Dados e Suas Aplicações

Apresentações semelhantes


Apresentação em tema: "SCC Bancos de Dados e Suas Aplicações"— Transcrição da apresentação:

1 SCC0141 - Bancos de Dados e Suas Aplicações
Prof. José Fernando Rodrigues Júnior PL/SQL – Coleções Material original: Profa. Elaine Parros Machado de Sousa

2 PL/SQL Coleções nested table: equivale a um array, mas
admite operações em qq posição assemelha-se a uma tabela com um único atributo TYPE type_name IS TABLE OF element_type [NOT NULL]; index-by table associative arrays: similar a hash structures TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size_limit)]; varray variable-size array: remoções (delete) apenas na extremidade tamnho pré-definido TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF element_type [NOT NULL]; BINARY_INTEGER x PLS_INTEGER: tem a mesma utilidade, com diferenças apenas de back-end, pls_integer uses machine arithmetic whereas binary_integer uses library arithmetic. Hence pls_integer is recommended for better performance. VARRAY é o mesmo que VARYING ARRAY.

3 Coleções Nested Tables TYPE tipo_tabela IS TABLE OF tipo [NOT NULL];
x(1) x(2) x(4) x(6) João Ana José Lia Nested Tables semelhantes a arrays unidimensionais valores não contíguos em memória não há número máximo de elementos – mas há nro de posições ocupáveis começam densas, mas podem ficar esparsas após remoções chaves devem ser seqüenciais não podem ser negativas número de chaves: 2GB precisam ser inicializadas o índice começa em 1 TYPE tipo_tabela IS TABLE OF tipo [NOT NULL];

4 declare -- declaração TYPE t_numeros IS TABLE OF number; -- inicialização - construtor v_tab1 t_numeros := t_numeros(); -- coleção vazia v_tab2 t_numeros := t_numeros(10, 20, 30); -- coleção com 3 elementos v_tab3 t_numeros; -- coleção NULL begin v_tab1.extend(2); -- cria duas posições v_tab1(1) := 20; v_tab1(2) := 30; v_tab2(1) := v_tab2(1) + 1; -- gerando exceções... v_tab2(4) := -1; -- acesso a elemento inexistente v_tab3(1) := 0; -- acesso a coleção não inicializada exception when SUBSCRIPT_BEYOND_COUNT then dbms_output.put_line ('Elemento não existe!'); when COLLECTION_IS_NULL then dbms_output.put_line ('Coleção não inicializada!'); end;

5 Coleções x(1) x(2) x(3) x(4) João Ana Lia José VARRAY semelhante a um array (de tamanho variável) em C ou Java valores contíguos em memória chaves devem ser seqüenciais não podem ser negativas número máximo de posições definido na declaração tamanho do vetor corresponde ao nro de elementos armazenados não podem ser esparsos elementos removidos somente do final do array precisam ser inicializados TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF element_type [NOT NULL]; no banco, arrays com até 4K são armazenados dentro da tabela… mais que isso, são armazenados separados...

6 declare -- declaração TYPE t_alunos IS VARRAY(12) OF varchar(30); -- inicializa array com 2 elementos v_alunos t_alunos := t_alunos('usp', 'unesp'); begin v_alunos.extend; -- primeiro aloca espaço, depois usa -- posição 3, pois as duas primeiras já foram usadas -- na inicialização v_alunos(3) := 'UFSCar'; -- exceção: excedendo o tamanho máximo, pois o tipo foi -- definido com 3 posições v_alunos.extend; exception when SUBSCRIPT_OUTSIDE_LIMIT then dbms_output.put_line ('Violação do tamanho do array'); end;

7 Coleções Index-by tables
CHAVE VALOR -1 João 2 Lisa 1 Ana Coleções Index-by tables semelhantes a tabelas com duas colunas: chave, valor chaves podem ser integer ou string valores não contíguos em memória podem ser esparsas semelhante a um hash map chaves não precisam ser seqüenciais integer - podem ser negativas número de elementos limitado pelo tipo da chave: PLS_INTEGER, VARCHAR2 não precisam ser inicializadas TYPE tipo_tabela IS TABLE OF tipo INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARCHAR2(size_limit)]; PLS_INTEGER: tipo PL/SQL (não é armazenado no banco – VERSÃO NOVA DO BINARY_INTEGER) para manipular inteiro – formato binário: de -2 bilhões a + 2 bilhões - menos espaço e mais otimizado que NUMBER BINARY_INTEGER: tipo PL/SQL (não é armazenado no banco) para manipular inteiro – formato binário: de -2 bilhões a + 2 bilhões

8 DECLARE TYPE population_type IS TABLE OF NUMBER INDEX BY VARCHAR2(64); country_population population_type; howmany NUMBER; which VARCHAR2(64); BEGIN country_population('Greenland') := 1; country_population('Iceland') := 2; howmany := country_population('Greenland'); country_population('Japao') := 3; country_population('Franca') := 4; country_population('Japao') := 5; --vale a ordem alfabética which := country_population.FIRST; dbms_output.put_line(which); howmany := country_population(which); dbms_output.put_line(howmany); which := country_population.NEXT(country_population.FIRST); which := country_population.PRIOR(country_population.LAST); which := country_population.LAST; END; OBS: o nome de um campo do record deve ser diferente dos nomes das tabelas usadas com %type

9 PL/SQL Registros e coleções Registro manipulação de várias variáveis
TYPE t_aluno IS RECORD ( nome aluno.nome%type, nusp aluno.nusp%type ); v_aluno t_aluno;

10 TYPE t_aluno IS RECORD ( nome aluno.nome%type, nusp aluno.nusp%type );
declare TYPE t_aluno IS RECORD ( nome aluno.nome%type, nusp aluno.nusp%type ); -- declaração TYPE t_tab_alunos IS TABLE OF t_aluno INDEX BY PLS_INTEGER; v_alunos t_tab_alunos; -- coleção vazia begin -- atribuição de valores, basta endereçar com a chave desejada v_alunos(0).nome := 'Aline'; v_alunos(0).nusp := 444; v_alunos(-2).nome := 'Lia'; v_alunos(-2).nusp := 999; dbms_output.put_line ('Acessando aluno (0): ' || v_alunos(0).nome); -- acesso a elemento inexistente – semelhante a SELECT que retorna vazio dbms_output.put_line ('Acessando aluno (2): ' || v_alunos(2).nome); exception when NO_DATA_FOUND then dbms_output.put_line ('Elemento 2 não exite!'); end; OBS: o nome de um campo do record deve ser diferente dos nomes das tabelas usadas com %type

11 declare TYPE t_aluno IS RECORD ( nome aluno.nome%type, nusp aluno.nusp%type ); -- declaração TYPE t_tab_alunos IS TABLE OF t_aluno INDEX BY PLS_INTEGER; v_alunos t_tab_alunos; -- coleção vazia begin -- atribuição de valores – semelhante a INSERT se elemento i não existe v_alunos(0).nome := 'Aline'; v_alunos(0).nusp := 444; v_alunos(-2).nome := 'Lia'; v_alunos(-2).nusp := 999; dbms_output.put_line ('Acessando aluno (0): ' || v_alunos(0).nome); -- acesso a elemento inexistente – semelhante a SELECT que retorna vazio dbms_output.put_line ('Acessando aluno (2): ' || v_alunos(2).nome); exception when NO_DATA_FOUND then dbms_output.put_line ('Elemento 2 não exite!'); end; Record tem uso semelhante a %ROWTYPE, com a diferença de que é possível definir os campos com mais liberdade. OBS: o nome de um campo do record deve ser diferente dos nomes das tabelas usadas com %type

12 Coleções INDEX-BY NESTED VARRAY AMBAS Com tamanho máximo = LIMIT
Sem tamanho máximo Com tamanho máximo = LIMIT Podem ser esparsas – inserções e remoções em qualquer posição – sem ordem Densas, com indexação em sequência – não admite remoções Sem inicialização A estrutura, bem como cada posição, deve ser inicializada/alocada antes do uso Utilizam atributos de tabela Utilizam métodos adicionais de coleção Não podem assumir valores NULL Podem armazenar valores NULL Raise NO_DATA_FOUND para elementos inexistentes Raise SUBSCRIPT_BEYOND_COUNT para referências a elementos inexistentes exist (i) – verifica que i-ésimo elemento existe – evita exceção de elemento inexistente count – nro de elementos armazenados limit – nro máximo de elementos que podem ser armazenados – é NULL se não existe tal valor first e last – menor e maior índices – são null se a coleção está vazia prior e next – indices anterior e posterior a i – usados para loop extend – cria elementos vazios – (n) cria n elementos null – (n, i) cria n cópias do iésimo elemento trim – remove um elemento do final da coleção – (n) remove n elementos do final da coleção – não é usado para index-by tables delete – remove todos os elementos – (i) remove o i-ésimo elemento – (i,j) removo do i-ésimo ao j-ésimo elemento

13 DELETE/DELETE(i)/DELETE (i,j)
Método Retorno Validade EXISTS(i) true/false nested varray index-by COUNT NUMBER LIMIT nested (sem aplicação – use COUNT) FIRST/LAST BINARY_INTEGER NEXT(i)/PRIOR(i) EXTEND/EXTEND(n) Void varray (até LIMIT) TRIM/TRIM(n) DELETE/DELETE(i)/DELETE (i,j) void Coleções exist (i) – verifica que i-ésimo elemento existe – evita exceção de elemento inexistente count – nro de elementos armazenados limit – nro máximo de elementos que podem ser armazenados – é NULL se não existe tal valor first e last – menor e maior índices – são null se a coleção está vazia prior e next – indices anterior e posterior a i – usados para loop extend – cria elementos vazios – (n) cria n elementos null – (n, i) cria n cópias do iésimo elemento trim – remove um elemento do final da coleção – (n) remove n elementos do final da coleção – não é usado para index-by tables delete – remove todos os elementos – (i) remove o i-ésimo elemento – (i,j) removo do i-ésimo ao j-ésimo elemento

14 Coleções Coleção Inicialização Alocação n_my:= typename();
Nested n_my:= typename(); n_my:= typename(e1,e2, ..., en); n_my.extend  +1 com valor NULL n_my.extend(n)  +n com Varray v_my:= typename(); v_my:= typename(e1,e2, ..., en); Até o valor LIMIT Index-by Não necessária Coleções exist (i) – verifica que i-ésimo elemento existe – evita exceção de elemento inexistente count – nro de elementos armazenados limit – nro máximo de elementos que podem ser armazenados – é NULL se não existe tal valor first e last – menor e maior índices – são null se a coleção está vazia prior e next – indices anterior e posterior a i – usados para loop extend – cria elementos vazios – (n) cria n elementos null – (n, i) cria n cópias do iésimo elemento trim – remove um elemento do final da coleção – (n) remove n elementos do final da coleção – não é usado para index-by tables delete – remove todos os elementos – (i) remove o i-ésimo elemento – (i,j) removo do i-ésimo ao j-ésimo elemento

15 CURSOR FOR LOOP Antes: DECLARE CURSOR c_old IS
SELECT L1.nome, L1.nrousp FROM lbd01_vinculo_usp L1; v_old c_old%ROWTYPE; BEGIN OPEN c_old; LOOP FETCH c_old INTO v_old; EXIT WHEN c_old%NOTFOUND; dbms_output.put_line(v_old.nrousp); END LOOP; CLOSE c_old; END; no banco, arrays com até 4K são armazenados dentro da tabela… mais que isso, são armazenados separados...

16 CURSOR FOR LOOP Com CURSOR FOR LOOP: DECLARE CURSOR c_new IS
SELECT L1.nome, L1.nrousp FROM lbd01_vinculo_usp L1; BEGIN FOR v_new IN c_new LOOP dbms_output.put_line(v_new.nrousp); END LOOP; END;

17 BULK COLLECT Coleções implicam na cópia de dados do banco para a memória A maneira direta de se fazer isso é: Declara cursor Abre Fetch Copia dados para a coleção Próxima tupla Esse procedimento é custoso, pois implica na alternância entre contextos entre o engine SQL e o engine PL/SQL Alternativamente, pode-se usar BULK COLLECT

18 BULK COLLECT Com o BULK COLLECT: Exemplo: Declara cursor Abre
Copia (bulk collect) dados para a coleção, todos em uma única operação Exemplo: declare cursor cTemp is select * from L01_MORADOR; type tCollectionType is table of cTemp%rowtype; cCollection tCollectionType; begin open cTemp; fetch cTemp bulk collect into cCollection; for i in 1..cCollection.count loop dbms_output.put_line(cCollection(i).mcpf); end loop; end;

19 PL/SQL - Coleções Manual de consulta:
comparação entre tipos de coleções quando usar cada tipo métodos e atributos de coleções tipo de retorno, descrição, comportamento em cada tipo de coleção, ... exceções pré-definidas para coleções ... PL/SQL User’s Guide and Reference


Carregar ppt "SCC Bancos de Dados e Suas Aplicações"

Apresentações semelhantes


Anúncios Google