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

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

III – Oracle 9i Coleções.

Apresentações semelhantes


Apresentação em tema: "III – Oracle 9i Coleções."— Transcrição da apresentação:

1 III – Oracle 9i Coleções

2 Introdução Coleção: formada de objetos do mesmo tipo, cada um com um índice (posição) único dentro da coleção NESTED TABLE Nested Tables VARRAY Nested Tables x VARRAYs VARRAYS são densos; NESTED TABLES podem ser esparsas VARRAYS: pequenas coleções; NESTED TABLES: grandes coleções, ou coleções com tamanho indefinido Coleções funcionam como os arrays das linguagens de linguagens de programação de terceira geração (ex., JAVA). Nested Tables são tabelas dentro de tabelas. Mais precisamente, uma coluna de uma tabela pode ser do tipo tabela. As linhas de uma nested table podem ser endereçadas por um índice (ex. lista(1) ). Da mesma forma, uma coluna de uma tabela pode ser um VARRAY. É importante observar também que, dentro de um bloco PL/SQL, tipos NESTED TABLE ou VARRAY podem ser definidos; conseqüentemente, variáveis do tipo NESTED TABLE ou VARRAY podem ser definidas  coleções locais. VARRAYs têm um tamanho máximo definido na criação. Nested Tables podem crescer dinamicamente. VARRAYs são densos, ou seja, elementos individuais não podem ser removidos. Nested tables podem ser esparsos, isto é, criadas densas, mas com elementos individuais podendo ser removidos em qualquer tempo. VARRAYs em tabelas são armazenados da seguinte forma: in-line, se menor que 4K; se maior que 4K são armazenados out-of-line, porém no mesmo espaço da tabela. Nested tables em tabelas são armazenadas de forma especial, em tabelas criadas pelo sistema. VARRAYs são mais adequadas para armazenar pequenas coleções.

3 Definindo Coleções Locais
Nested Table: TYPE tipo IS TABLE OF tipo_elemento [NOT NULL]; VARRAY: TYPE tipo IS VARRAY (tamanho_máximo) OF tipo_elemento [NOT NULL]; “tipo” é o identificador que será utilizado mais tarde para declarar variáveis coleções. “tamanho_máximo” é um inteiro positivo definindo o número máximo de elementos que o VARRAY poderá conter. “tipo_elemento” é o tipo de dados PL/SQL exceto: BINARY_INTEGER, PLS_INTEGER BOOLEAN BLOB, CLOB (restriction applies only to varrays) LONG, LONG RAW NATURAL, NATURALN NCHAR, NCLOB, NVARCHAR2 tipos de objtetos com atributos BLOB ou CLOB (restrição apenas para VARRAYs) tipos de objetos com atributos TABLE ou VARRAY POSITIVE, POSITIVEN REF CURSOR SIGNTYPE STRING “tipo_elemento” também pode ser definido pelo usuário. NOT NULL significa que, dada uma variável do tipo, não pode ser atribuído NULL a nenhum elemento da coleção. Observação muito importante: uma coleção vazia (iniciada com o construtor da coleção) não é uma coleção em que todos os elementos são nulos. Bem diferentemente, uma coleção vazia não tem elementos ainda.

4 Definindo Coleções Locais - Exemplos
DECLARE TYPE Calendar IS VARRAY(366) OF DATE; TYPE ListaNomes IS TABLE OF VARCHAR2(30); TYPE ListaEmp IS TABLE OF emp.nome%TYPE; TYPE Item IS RECORD ( codigo VARCHAR2(20), quantidade INTEGER); TYPE Estoque IS VARRAY(250) OF Item; TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE; No primeiro exemplo, a definição de um VARRAY especifica o número máximo de elementos que pode ser armazenado. Para especificar o tipo de elemento em uma definição de uma coleção pode-se utilizar “%TYPE” para obter o tipo de dados de uma coluna de tabela. Se o tipo for a linha de uma tabela, então especifica-se “%ROWTYPE”. Por fim uma coleção do tipo VARRAY é criada, onde os elementos são de um tipo definido pelo usuário.

5 Definindo Coleções de BD
CREATE TYPE ListaCursos AS TABLE OF VARCHAR2(10) / CREATE TYPE Estudante AS OBJECT ( -- create object id_num INTEGER(4), nome VARCHAR2(25), endereço VARCHAR2(35), cursos ListaCursos) CREATE TABLE Estudante_tab OF Estudante NESTED TABLE cursos STORE AS cursos_tab

6 Definindo Coleções de BD (2)
CREATE TYPE Projeto AS OBJECT( id_projeto NUMBER(2), titulo VARCHAR2(35), custo NUMBER(7,2)) / CREATE TYPE ListaProjetos AS VARRAY(50) OF Projeto CREATE TABLE departamento ( dept_id NUMBER(2), nome VARCHAR2(15), orcamento NUMBER(11,2), projetos ListaProjetos) Neste exemplo, foi criado um tipo de objeto PROJETO, um tipo de coleção que armazena projetos, e a coleção (VARRAY) foi colocada como um atributo de uma tabela departamento.

7 Coleções e Procedures (Funções)
TYPE Equipe IS TABLE OF Empregado; ... PROCEDURE premia (membros IN Equipe); DECLARE TYPE EquipeVenda IS VARRAY(25) OF Vendedor; FUNCTION melhores_vendedores (n INTEGER) RETURN EquipeVenda IS ... Exemplo de coleções como um parâmetro de uma função (ou procedimento) e como retorno de outra função.

8 Iniciando Coleções DECLARE meus_cursos ListaCursos; BEGIN
meus_cursos := ListaCursos(’Econ 2010’, ’Mat 3401’, ’Geren 3100’, ’Hist 3141’, ’Mark 3312’, ’Ingl 2005’); ... END; Exercício: coleção em que o tipo de cada elemento é REF; conjunto_projetos ListaProjetos; conjunto_projetos := ListaProjetos(Projeto(1, ’Gerar Novo Relatório’, 3250), Projeto(2, ’Conferir Folha Pagamento’, 12350), Projeto(3, ’Checar Credores’, 1425)); Até que seja iniciada, uma nested table ou VARRAY é atomicamente nula, ou seja, a coleção é nula (e pode ser comparada com “IS NULL”), e não seus membros. Para iniciar uma coleção, utiliza-se um construtor. No primeiro exemplo, o construtor é chamado com 6 parâmetros e cria um coleção contendo os 6 elementos. Os parâmetros podem ser objetos, no segundo exemplo, o construtores dos objetos são os parâmetros para o construtor da coleção.

9 Iniciando Coleções (2) DECLARE
TYPE Clientela IS VARRAY(100) OF Cliente; vips Clientela := Clientela(); /* coleção vazia <> coleção nula (ou não iniciada) */ BEGIN IF vips IS NOT NULL THEN /* verdade */ ... END IF; END; Neste exemplo a coleção vips é iniciada na declaração (boa prática de programação). O construtor chamado na iniciação não possui argumentos, retornando uma coleção vazia. Entretanto, uma coleção vazia é diferente de uma coleção não iniciada (que é nula), logo o teste de não nulidade retorna verdadeiro.

10 Iniciando Coleções (3) BEGIN INSERT INTO novatos
VALUES (Estudante(5035, ’Janet Alvarez’, ’122 Broad St’, ’FT’, ListaCursos(’Econ 2010’, ’Acct 3401’, ’Mgmt 3100’, ...))); Neste exemplo, é inserido um objeto estudante em uma tabela. O objeto estudante é composto por vários atributos, entre eles uma coleção, que é construída no momento da inserção.

11 Referenciando Elementos de Coleções
DECLARE TYPE Nomes IS TABLE OF VARCHAR2(15); nomes Nomes := Nomes(’J Hamil’, ’D Caruso’, ’R Singh’, ...); i BINARY_INTEGER; BEGIN ... IF nomes(i) = ’J Hamil’ THEN END IF; END; Para referenciar coleções utiliza-se o índice entre parênteses seguindo o nome da coleção.

12 Referenciando Elementos de Coleções (2)
DECLARE TYPE Nomes IS TABLE OF VARCHAR2(15); nomes Nomes := Nomes(’J Hamil’, ’D Piro’, ’R Singh’, ...); i BINARY_INTEGER; BEGIN ... verify_nome(nomes(i)); -- call procedure Neste exemplo é feita uma referência a um elemento da coleção em uma chamada de função.

13 Referenciando Elementos de Coleções (3)
DECLARE TYPE Equipe IS VARRAY(20) OF Empregado; FUNCTION novo_contratado (data_contrato DATE) RETURN Equipe IS ... BEGIN staffer := novo_contratado(’16-OCT-96’)(3); ... END; Neste exemplo, o acesso é feito ao terceiro elemento do VARRAY formado pelo retorno da função.

14 Atribuindo Coleções DECLARE TYPE Clientela IS VARRAY(100) OF Cliente;
TYPE Vips IS VARRAY(100) OF Cliente; grupo1 Clientela := Clientela(...); grupo2 Clientela := Clientela(...); grupo3 Clientela; /* Atomicamente nula */ grupo4 Vips := Vips(...); BEGIN grupo2 := grupo1; grupo1 := NULL; grupo3 := grupo2; /* Erro de compilação: por quê? */ Coleções podem ser atribuídas através de INSERT, UPDATE, FETCH, ou SELECT, uma atribuição direta, ou uma chamada de função. No exemplo acima pode-se ver exemplos de atribuições direta. As coleções precisam ter o mesmo tipo de dados, ter o mesmo tipo de elemento não é suficiente. Mesmo quando coleções têm o mesmo tipo de elementos e o mesmo nome de tipo mas estão em pacotes diferentes (ou uma local e outra em um pacote) elas são consideradas tipos de dados diferentes e atribuições de uma coleção de um tipo a uma outra de outro tipo gera erro de compilação. As coleções grupo1 e grupo2 são iniciadas na declaração. A coleção grupo3 é apenas declarada (e portanto é nula). A coleção grupo4 é de um tipo de dados diferente dos demais, e apesar de ter o mesmo tipo (e quantidade máxima) de elementos, tem um tipo de dados diferente. Desta forma, a primeira atribuição é válida e torna grupo2 uma cópia de grupo1. A segunda atribuição torna grupo1 atomicamente nula (ela é nula, e não seus elementos). A terceira atribuição não é válida e resulta em erro de compilação.

15 Atribuindo Elementos de Coleções
DECLARE TYPE NumList IS TABLE OF INTEGER; nums NumList; BEGIN nums(1) := 10; -- COLLECTION_IS_NULL: ERROR! nums := NumList(10,20,30); nums(1) := ASCII(’A’); nums(2) := 10 * nums(1); nums(’B’) := 15; -- VALUE_ERROR nums(4) := 40; -- SUBSCRIPT_BEYOND_COUNT END; É possível acessar um elemento de uma coleção através de um índice. Caso o índice seja nulo ou não seja um inteiro é lançada a exceção VALUE_ERROR. Caso o índice se refira a um elemento não iniciado é lançada a exceção SUBSCRIPT_BEYOND_COUNT. Se a coleção for nula, é lançada a exceção COLLECTION_IS_NULL. A primeira atribuição lança a exceção COLLECTION_IS_NULL. A segunda, terceira e quarta são válidas. A quinta lança a exceção VALUE_ERROR. E a última lança SUBSCRIPT_BEYOND_COUNT. Neste caso é assumido que a execução continuaria (de modo que as três exceções pudessem ser lançadas).

16 Comparando Coleções DECLARE TYPE Clientela IS TABLE OF Cliente;
grupo1 Clientela := Clientela(...); grupo2 Clientela := Clientela(...); grupo3 Clientela; BEGIN ... IF grupo1 = grupo2 THEN -- erro de compilação END IF; IF grupo3 IS NULL THEN ... END; Coleções não podem ser comparadas explicitamente por igualdade ou desigualdade, também não podem ser comparadas implicitamente com DISTINCT, GROUP BY ou ORDER BY. A única comparação válida para toda uma coleção é verificar se a coleção é atomicamente nula. Como na comparação de grupo3 acima (o resultado desta comparação será verdadeiro, pois ela não foi iniciada).

17 Manipulando Coleções - Nested Tables
SQL> CREATE TYPE Curso AS OBJECT ( 2 n_curso NUMBER(4), 3 titulo VARCHAR2(35), 4 creditos NUMBER(1)); SQL> CREATE TYPE ListaCursos AS TABLE OF Curso; SQL> CREATE TABLE departamento ( 2 nome VARCHAR2(20), 3 diretor VARCHAR2(20), 4 secretaria VARCHAR2(20), 5 cursos ListaCursos) 6 NESTED TABLE cursos STORE AS cursos_tab; Coleções permitem que um subprograma acesse elementos individuais da mesma e principalmente, acesse os elementos de uma coleção na memória através de SQL. No exemplo acima foi criado um tipo de objeto Curso e uma nested table ListaCursos que é uma coleção de elementos tipo Curso. Por fim, é criada uma tabela departamento onde uma das colunas é do tipo ListaCursos. Na criação da tabela um nome (cursos_tab) é dado à tabela do sistema que armazenará a nested table.

18 Manipulando Coleções - Nested Tables (2)
BEGIN INSERT INTO departamento VALUES(’Psicologia’, ’Irene Santos’, ’R. 1o. Maio 133’, ListaCursos(Curso(1000, ’ Psicologia Gerak’, 5), Curso(2100, ’Psicologia Experimental’, 4), Curso(4410, ’Psicologia Especial’, 4))); VALUES(’Línguas’, ’Mara Silva’, ’R. 7 de Setembro 205’, ListaCursos(Curso(1002, ’Escrita Oficial’, 3), Curso(2020, ’Literatura e Cinema’, 4), Curso(2418, ’Ficção Científica Moderna’, 3), Curso(3870, ’Contos’, 5))); END; No exemplo acima, dois registros são inseridos na tabela departamento. O construtor ListaCursos() é utilizado para criar a nested table no momento da criação. Outros exemplos serão dados a partir destes dois registros.

19 Manipulando Coleções - Nested Tables (3)
DECLARE novos_cursos ListaCursos := ListaCursos(Curso(1002, ’Escrita Oficial’, 3), Curso(2020, ’Literatura e Cinema’, 4), Curso(4725, Português Instrumental’, 5)); BEGIN UPDATE departamento SET cursos = novos_cursos WHERE nome = ’Línguas’; END; Neste exemplo, a coluna ListaCursos do registro cujo nome do departamento é “Línguas” é substituida.

20 Manipulando Coleções - Nested Tables (4)
DECLARE psic_cursos ListaCursos; BEGIN SELECT cursos INTO psic_cursos FROM departamento WHERE nome = ’Psicologia’; ... END; Neste exemplo, a lista de cursos do departamento cujo nome é “Psicologia” é recuperada e armazenada na variável local cursos_psico. Mais tarde será apresentado como se manipular elementos das coleções.

21 Manipulando Coleções - VARRAY
SQL> CREATE TYPE Projeto AS OBJECT ( 2 project_no NUMBER(2), 3 titulo VARCHAR2(35), 4 custo NUMBER(7,2)); SQL> CREATE TYPE ListaProjetos AS VARRAY(50) OF Projeto; SQL> CREATE TABLE departamento ( 2 dept_id NUMBER(2), 3 nome VARCHAR2(15), 4 orcamento NUMBER(11,2), 5 projetos ListaProjetos); Neste exemplo é definido um objeto tipo Projeto. Em seguida, um tipo VARRAY, o ListaProjetos, é criado que armazena elementos do tipo Projeto. Finalmente, uma tabela departamento é criada contendo uma coluna do tipo ListaProjetos.

22 Manipulando Coleções – VARRAY (2)
BEGIN INSERT INTO departamento VALUES(50, ’Manutenção’, , ListaProjetos(Projeto(1, ’Reparar Vazamentos’, 2850), Projeto(2, ’Lavar Janelas’, 975), Projeto(3, ’Manutenção Ventiladores’, 1125))); VALUES(60, ’Segurança’, , ListaProjetos(Projeto(1, ’Transportar Pagamentos’, 9000), Projeto(2, ’Investigar Roubo Equipamentos’, 2750), Projeto(3, ’Verificar Saida de Emergência’,1900))); END; Aqui, dois registros são inseridos na tabela departamento. O construtor ListaProjetos() é utilizado para construir as VARRAYs no momento da inserção.

23 Manipulando Coleções – VARRAY (3)
DECLARE novos_projetos ListaProjetos := ListaProjetos(Projeto(1, ’Transportar Pagamentos’,9000), Projeto(2, ’Analisar Alarmes’, 2750), Projeto(3, ’Verificar Extintores’,1900))); BEGIN UPDATE departamento SET projetos = novos_projetos WHERE dept_id = 60; END; Aqui, os projetos do departamento com código (dept_id) igual a 60 são substituídos. Mais tarde será apresentado como lidar com elementos individuais das coleções.

24 Manipulando Coleções – VARRAY (4)
DECLARE meus_projetos ListaProjetos; BEGIN SELECT d.projetos INTO meus_projetos FROM departamento d WHERE d.dept_id = 30; ... END; Neste exemplo, a lista de cursos do departamento cujo identificador (dept_id) é 30 é recuperada e armazenada na variável local meus_projetos.

25 Manipulando Coleções – Função TABLE
BEGIN INSERT INTO TABLE(SELECT cursos FROM departamento WHERE nome = ’Línguas’) VALUES(1234, ’Inglês Instrumental’, 4); END; DECLARE ajuste INTEGER DEFAULT 1; UPDATE TABLE(SELECT cursos FROM departamento WHERE nome = ’Psicologia’) c SET c.creditos = c.creditos + ajuste WHERE c.n_curso IN (2200, 3540); Nested Tables. Para manipular elementos individuais de uma coleção é necessário fazer uma sub-consulta que retorne a coleção a ser manipulada. Esta sub-consulta é realizada através do operador TABLE. No primeiro exemplo, uma disciplina (um registro, já que se trata de uma tabela) é adicionado à nested table armazenada na coluna Cursos. No segundo exemplo, um pouco mais complicado, todos os cursos cujo código do curso (n_curso) esteja no conjunto {2200, 3540} terão seu número de créditos incrementado de acordo com o valor contido na variável ajuste (neste caso, o incremento é 1).

26 Manipulando Coleções – Função TABLE (2)
DECLARE meu_n_curso NUMBER(4); meu_titulo VARCHAR2(35); BEGIN SELECT c.n_curso, c.titulo INTO meu_n_curso, meu_titulo FROM TABLE(SELECT cursos FROM departamento WHERE nome = ’Línguas’) c WHERE c.n_curso = 1002; ... END; Nested Tables. No exemplo acima, o título e o número de créditos de um curso específico, cujo código é 1002, do departamento de Líguas é recuperado e armazenado nas variáveis locais meu_curso e meu_curso_creditos.

27 Manipulando Coleções – Função TABLE (3)
BEGIN DELETE TABLE(SELECT cursos FROM departamento WHERE nome = ’Línguas’) c WHERE c.creditos = 5; END; Nested Tables. Lembrando que as nested tables podem se tornar esparsas com o uso, neste exemplo são excluídos todos os cursos com 5 créditos no departamento “Línguas”.

28 Manipulando Coleções – Função TABLE (4)
DECLARE meu_custo NUMBER(7,2); meu_titulo VARCHAR2(35); BEGIN SELECT p.custo, p.titulo INTO meu_custo, meu_titulo FROM TABLE(SELECT projetos FROM departamento WHERE dept_id = 50) p WHERE p.project_no = 4; ... END; VARRAY. O operador TABLE também pode ser utilizado para acessar os elementos de um VARRAY. No exemplo acima, o custo e o título do projeto cujo código (n_projeto) é 4, do departamento cujo código (dept_id) é 50, são recuperados e armazenados nas variáveis locais meu_custo e meu_título.

29 Manipulando Coleções - Elementos
FOR i IN meus_projetos.FIRST..meus_projetos.LAST LOOP IF meus_projetos(i).project_no = proj_no THEN IF novo_titulo IS NOT NULL THEN meus_projetos(i).titulo := novo_titulo; END IF; IF novo_custo IS NOT NULL THEN meus_projetos(i).custo := novo_custo; EXIT; END LOOP; UPDATE departamento SET projetos = meus_projetos WHERE dept_no = dept_id; END update_project; VARRAY. Depois de recuperado a coleção e armazenada na variável local meus_projetos, então a coleção é varrida elemento a elemento em busca do projeto com código (n_proj) igual ao solicitado para ser atualizado (os operadores FIRST e LAST serão explicados mais adiante e significam, repectivamente, o primeiro e o último elemento válido do VARRAY). Uma vez encontrada a linha relacionada ao projeto desejado, os atributos do projeto são modificados de acordo com os parâmetros novo_título e novo_custo. Depois que a coleção local (armazenada em variável local) é atualizada, nas ultimas linhas, toda a coleção existente no atributo projetos do departamento em questão, é substituida.

30 Manipulando Coleções Locais
DECLARE revisado ListaCursos := ListaCursos(Curso(1002, ’Escrita Oficial’, 3), Curso(2020, ’Literatura e Cinema’, 4), Curso(3010, ’Gramática Portuguesa’, 3), Curso(3550, ’Realismo e Naturalismo’, 4)); num_diferentes INTEGER; BEGIN SELECT COUNT(*) INTO num_diferentes FROM TABLE(CAST(revisado AS ListaCursos)) novo, TABLE(SELECT cursos FROM departamento WHERE nome = ’Línguas’) AS antigo WHERE novo.n_curso = antigo.n_curso AND (novo.titulo != antigo.titulo OR novo.creditos != antigo.creditos); dbms_output.put_line(num_diferentes); END; O exemplo acima ilustra a manipulação de coleções locais, isto é, coleções armazenadas em variáveis locais. Neste exemplo é ilustrado o operador CAST, este operador converte uma coleção local para o tipo de coleção especificado, permitindo a manipulação de uma coleção local, como se fosse um tabela do banco de dados. No exemplo acima, a coleção local é comparada com a coleção armazenada no registro do departamento “Línguas” na tabela departamento. O número de diferenças entre os cursos comuns às duas tabelas é impresso.

31 Coleções Multidimensionais - VARRAY
declare type t1 is varray(10) of integer; type nt1 is varray(10) of t1; /* VARRAY multidimensional */ va t1 := t1(2,3,5); -- Inicia VARRAY multidimensional nva nt1 := nt1(va, t1(55,6,73), t1(2,4), va); i integer; va1 t1; begin -- Acesso multidimensional i := nva(2)(3); -- recupera o valor 73 dbms_output.put_line(i); end; VARRAY Multidimensional 1/2. Como citado anteriormente, coleções multidimensionais podem ser simuladas criando coleções onde os elementos são também coleções. Nos exemplos a seguir iremos ver coleções multidimensionais com VARRAYs, nested tables e index-by tables.

32 Coleções Multidimensionais – VARRAY (2)
-- adiciona novo elemento a nva nva.extend; nva(5) := t1(56, 32); -- substitui um elemento de primeiro nível (uma dimensão) nva(4) := t1(45,43,67,43345); -- substitui um elemento único nva(4)(4) := 1; -- troca por 1 -- acrescente um novo elemento ao 4o. Elemento VARRAY -- e armazena 89 nele. nva(4).extend; nva(4)(5) := 89; end; / VARRAY Multidimensional 2/2.

33 Coleções Multidimensionais - Nested Tables
declare type tb1 is table of varchar2(20); type ntb1 is table of tb1; /* tabela com elementos também tabelas */ type tv1 is varray(10) of integer; type ntb2 is table of tv1; /* tabela com elementos VARRAY */ vtb1 tb1 := tb1('one', 'three'); vntb1 ntb1 := ntb1(vtb1); vntb2 ntb2 :=ntb2(tv1(3,5), tv1(5,7,3)); /* tabela com elementos VARRAY */ Nested Table Multidimensional 1/2. Nested table multidimensional.

34 Coleções Multidimensionais - Nested Tables (2)
begin vntb1.extend; vntb1(2) := vntb1(1); -- apaga o primeiro elemento de vntb1 vntb1.delete(1); /* apaga a primeira cadeia da segunda tabela na nested table */ vntb1(2).delete(1); end; / Nested Table Multidimensional 2/2.

35 Métodos de Coleções EXISTS
IF cursos.EXISTS(i) THEN cursos(i) := novo_curso; END IF; COUNT IF projetos.COUNT = 25 THEN ... LIMIT IF projetos.LIMIT = 25 THEN EXISTS = Verifica se o elemento com o índice especificado existe. Não lança exceções. É útil para o gerenciamento de nested tables esparças. COUNT = O número de elementos válido que a nested table contem ou o maior índice de um VARRAY. LIMIT = O tamanho máximo de um VARRAY.

36 Métodos de Coleções (2) FIRST e LAST
IF cursos.FIRST = cursos.LAST THEN /* só um elemento */ FOR i IN cursos.FIRST..cursos.LAST LOOP ... PRIOR e NEXT i:=cursos.FIRST; -- o índice do primeiro elemento WHILE i IS NOT NULL LOOP ... i:=cursos.NEXT(i); END LOOP; FIRST e LAST = retorna o índice do primeiro e do último, respectivamente, elemento válido de uma coleção. PRIOR e NEXT = retorna o índice do anterior e do próximo, respectivamente, elemento válido de uma coleção.

37 Métodos de Coleções (3) EXTEND
cursos.EXTEND; -- acrescenta 1 elemento NULL cursos.EXTEND(5,1); -- acrescenta 5 cópias do elemento 1 cursos.EXTENDS(3); -- acrescenta 3 elementos NULL TRIM cursos.TRIM(2); -- remove a posição 2 cursos.TRIM; -- remove a última posição DELETE cursos.DELETE(2); -- remove a posição 2 cursos.DELETE(2,6); -- remove as posições de 2 a 6 projetos.DELETE; -- remove toda a coleção Atenção: EXTEND, TRIM e DELETE ignoram as posições removidas. Por exemplo, se uma coleção foi criada com 10 elementos, e a posição 10 foi removida por TRIM ou DELETE, EXTEND acrescenta 1 elemento NULL na posição 11. As demais funções (COUNT, LAST, …) não ignoram as posições removidas. Para o exemplo anterior, e imediatamente depois da posição 10 removida, COUNT = 9, LAST = 9, etc. EXTEND = Acrescenta um elemento nulo ao fim da coleção, ou (m,n), m cópias do elemento cujo índice é n. TRIM = remove 1 ou n elementos do fim da coleção. DELETE = remove o elemento especificado, a faixa de elementos especificados ou todos os elementos de uma coleção.

38 Exceções COLLECTION_IS_NULL Operando em uma coleção atomicamente nula.
NO_DATA_FOUND O índice se refere a um elemento que foi apagado. SUBSCRIPT_BEYOND_COUNT O índice excede o número de elementos na coleção. SUBSCRIPT_OUTSIDE_LIMIT O índice está fora do intervalo permitido. VALUE_ERROR O índice é nulo ou não conversível para um inteiro.

39 Multi Nested Types CREATE OR REPLACE TYPE Programa_objtyp
CREATE OR REPLACE TYPE Aluno_objtyp CREATE OR REPLACE TYPE Turma_objtyp CREATE OR REPLACE TYPE Erro_objtyp AS OBJECT( ErroNo NUMBER, Tipo NUMBER(2), Descricao VARCHAR2(20), VlDescontoNota NUMBER(2,2), Programa_ref REF Programa_objtyp )

40 Multi Nested Types (2) CREATE OR REPLACE TYPE ErroList_ntabtyp AS TABLE OF Erro_objtyp CREATE OR REPLACE TYPE Programa_objtyp AS OBJECT( ProgramaNo NUMBER, Nome VARCHAR2(20), DtcEntrega DATE, Nota NUMBER(2), ErroList_ntab ErroList_ntabtyp, Aluno_ref REF Aluno_objtyp ) CREATE OR REPLACE TYPE ProgramaList_ntabtyp AS TABLE OF Programa_objtyp

41 Multi Nested Types (3) CREATE OR REPLACE TYPE Pessoa_objtyp AS OBJECT(
Nome VARCHAR2(40), DtcNascimento DATE ) CREATE OR REPLACE TYPE Aluno_objtyp UNDER Pessoa_objtyp AS OBJECT( Matricula NUMBER, ProgramaList_ntab ProgramaList_ntabtyp, Turma_ref REF Turma_objtyp CREATE OR REPLACE TYPE AlunoList_ntabtyp AS TABLE OF Aluno_objtyp

42 Multi Nested Types (4) AlunoList_ntab AlunoList_ntabtyp /*
Turma_objtyp AlunoList_ntab ProgramaList_ntab ErroList_ntab */ CREATE OR REPLACE TYPE Turma_objtyp AS OBJECT( Codigo NUMBER, Horario DATE, Vagas NUMBER(2), Periodo_inicial DATE, Periodo_final DATE, AlunoList_ntab AlunoList_ntabtyp )

43 CREATE TABLE Turma_objtab OF Turma_objtyp (
PRIMARY KEY(Codigo)) NESTED TABLE AlunoList_ntab STORE AS TurmaAluno_ntab ((PRIMARY KEY (NESTED_TABLE_ID, Matricula)) ORGANIZATION INDEX COMPRESS NESTED TABLE ProgramaList_ntab STORE AS innerAlunoProg_ntab ((PRIMARY KEY (NESTED_TABLE_ID, ProgramaNo)) NESTED TABLE ErroList_ntab STORE AS innerProgErro_ntab (NESTED_TABLE_ID, ErroNo)) ORGANIZATION INDEX COMPRESS)) )


Carregar ppt "III – Oracle 9i Coleções."

Apresentações semelhantes


Anúncios Google