Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle PL/SQL - Coleções (tabelas aninhadas)


Neste tutorial, você aprenderá como declarar e inicializar coleções Oracle PL/SQL (tabelas aninhadas).

Oracle PL/SQL - Tabelas aninhadas


As tabelas aninhadas são muito semelhantes às tabelas PL/SQL, conhecidas no Oracle como index-by mesas. Tabelas aninhadas estendem a funcionalidade de index-by table adicionando métodos de coleta extras (conhecidos como atributos de tabela para index-by tabelas) e adicionando a capacidade de armazenar tabelas aninhadas dentro de uma tabela de banco de dados, razão pela qual são chamadas de tabelas aninhadas.

As tabelas aninhadas também podem ser manipuladas diretamente usando SQL e têm exceções predefinidas adicionais disponíveis.

Além desses recursos extras, a funcionalidade básica de uma tabela aninhada é a mesma de uma tabela PL/SQL. Uma tabela aninhada pode ser considerada como uma tabela de banco de dados com duas colunas-chave e valor. Como index-tables , as tabelas aninhadas podem ser esparsas e as chaves não precisam ser sequenciais.

Declarando uma tabela aninhada


A sintaxe para criar um tipo de tabela aninhada é
TYPE table_name  é TABELA DE tipo_tabela  [NÃO NULO];

onde table_name é o nome do novo tipo e table_type é o tipo de cada elemento na tabela aninhada. Table_type pode ser um tipo interno, um tipo de objeto definido pelo usuário ou uma expressão usando % TIPO.

Observação


A única diferença sintática entre tabelas index-by e tabelas aninhadas é a presença da cláusula INDEX BY BINARY_INTEGER. Se esta cláusula não estiver presente, o tipo é um tipo de tabela aninhada. Se esta cláusula estiver presente, então o tipo é um tipo de tabela de índice.

A seguinte seção declarativa de código mostra algumas declarações de tabela válidas:
DECLARE--Define um tipo de tabela baseado em um objeto typeTYPE t_ClassTab IS TABLE OF Classobj;--Um tipo baseado em%ROWTYPEType t_StudentsTab IS TABLE Of students%ROWTYPE;--Variáveis ​​dos tipos acimav_ClassList t_ClassesTab;v_StudentList t_StudentsTab; 

Oracle PL/SQL - Inicialização de tabela aninhada


Quando uma tabela é declarada como no bloco anterior, ela é inicializada para ser atomicamente NULL, como um tipo de objeto. Se você tentar atribuir a uma tabela NULL, o erro "ORA-6531:referência à coleção não inicializada " que corresponde à exceção predefinida COLLECTION_IS_NULL , é elevado.

Continuando o exemplo anterior, a seção de execução a seguir gerará este erro:
BEGIN--Esta atribuição aumentará COLLECTION_IS_NULL porque--v_ClassList é automaticamente null.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END; 
Então, como você inicializa uma tabela aninhada? Isso pode ser feito usando o construtor. Como um construtor de tipo de objeto, o construtor de uma tabela aninhada tem o mesmo nome que o próprio tipo de tabela. No entanto, ele recebe como argumento uma lista de elementos, cada um dos quais deve ser compatível com o tipo de elemento da tabela.

O exemplo a seguir ilustra o uso do construtor de tabela nsat3eed:
DECLARETYPE t_NUMBERSTab IS TABLE OF NUMBER;-- Cria uma tabela com um elemento.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Cria uma tabela com cinco elementos.v-Primes t_numbersTab :=t_NumbersTab(1, 2, 3 , 5, 7);-- Cria uma tabela sem elementos.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Atribui a v_Tab1(1). Isso substituirá o valor ready-- em v_Tab(1), que foi inicializado para -1.v_Tab(1) :=12345;END;

Tabelas vazias


Observe a declaração de v_Tab2 no bloco anterior:
-- Cria uma tabela sem elementos.v_Tab2 t_NumbersTab :=t_NumbersTab();

v_Tab2 é inicializado chamando o construtor sem argumentos. Isso cria uma tabela que não possui elementos, mas não é atomicamente NULL. O bloco a seguir ilustra isso:
DECLARETYPE t_WordsTab IS TABLE OF VARCHAR2(50);--Cria uma tabela NULL.v_Tab1 t_WordsTab;--Cria uma tabela com um elemento, que é NULL.v_Tab2 t_WordsTab :=t_WordsTab();BEGINIF v_Tab1 IS NULL THENDBMS_OUTPUT .PUT_LINE('v_Tab1 is NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab is not NULL');END IF;IF v_Tab2 IS NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 is NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab2 is NULL' );END IF;END;

Se executarmos este bloco, obteremos a seguinte saída:
v_Tab1 é NULLv_Tab2 não é NULL

Chaves na inicialização


Quando uma tabela é inicializada usando um construtor, os elementos da tabela são numerados sequencialmente, variando de 1 ao número de elementos especificado na chamada do construtor. Durante o processamento posterior, os valores armazenados em algumas teclas podem ser excluídos (usando o método DELETE). quando uma tabela aninhada é selecionada do banco de dados, as chaves são renumeradas, se necessário, para serem sequenciais, como na inicialização.