• Nenhum resultado encontrado

Tabelas por índice

No documento Treinamento. Sumário (páginas 83-87)

➢ Tabelas aninhadas;

➢ Arrays de tamanho variado (varray).

Se você conhece as outras linguagens de programação, pense em uma coleção como algo semelhante a um array (Um vetor). Um array é uma série de elementos repetidos, todos do mesmo tipo. Você vai aprender que alguns tipos de coleção da Oracle são mais parecidos com arrays tradicionais do que outros.

Tabelas por índice

As tabelas por índice são um dos três tipos de coleção suportados pela PL/SQL. Na verdade, elas são o tipo de coleção original. Nas primeiras versões da PL/SQL, as tabelas por índices eram o único tipo de coleção disponível.

Uma tabela por índice é uma tabela de elementos mantida em memória, onde cada elemento é indexado por um valor de inteiro. As tabelas por índice funcionam da mesma forma que os arrays, com algumas diferenças:

➢ Uma tabela por índice pode ser populada esparsamente;

➢ Você não define um tamanho máximo para uma tabela por índice.

Declarando uma tabela por índice

Para declarar uma tabela por índice você deve:

1. Definir um tipo, especificando um datatype para a coleção e outro para o índice da tabela, sendo que, o datatype da coleção pode ser um tipo escalar, tal como um NUMBER ou VARCHAR2, ou ele pode ser um tipo composto, tal como um registro e o datatype do índice da tabela deve sempre ser BINARY_INTEGER.

2. Declarar uma variável do tipo definido.

A sintaxe para declarar um tipo para tabela de índice é o seguinte:

TYPE type_name IS TABLE OF data_type [NOT NULL] INDEX BY BINARY_INTEGER;

Onde:

type_name é o nome do tipo que você está declarando (Ele será usado para definir o tipo das variáveis);

data_type é o tipo de dado da coleção, ou seja, cada elemento da tabela armazena um valor

desse tipo;

NOT NULL proíbe que uma entrada da tabela contenha valor nulo.

Abaixo, segue um exemplo de definição de tipos para coleção e declaração de variáveis desses tipos: DECLARE

TYPE TArrayNumerico IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

TYPE TRepresentante IS TABLE OF representante%ROWTYPE INDEX BY BINARY_INTEGER; -- Declaração de variáveis cOrdemRepresentante TArrayNumerico; cRepresentante TRepresentante; BEGIN NULL; END; /

No exemplo acima, a variável cOrdemRepresentante é como um array de uma única coluna do tipo number e a variável cRepresentante é como uma matriz de duas dimensões, ou seja, um array contendo todas as colunas da tabela representante.

Manipulando uma tabela por índice Inserindo entradas em uma tabela por índice

Os elementos de uma tabela por índice são identificados exclusivamente por um valor de inteiro, ou índice. Sempre que referencia um valor da tabela, você deve fornecer o índice daquele valor. Para inserir os valores em uma tabela PL/SQL, você usa uma declaração de atribuição como esta:

table_var(index) := value;

Onde:

table_var é o nome da variável do tipo tabela por índice;

index é o valor de inteiro que indica o índice da entrada e pode ser qualquer número entre 1 e 2.147.483.647, não precisando ser consecutivos, ou seja, se você precisasse colocar apenas duas entradas em uma tabela, poderia usar os índices 1 e 2 ou poderia usar 1 e 2.147.483.647, ocupando em ambas situações, duas entradas apenas (A PL/SQL não reserva espaço para as entradas que não são usadas);

value é o valor a ser atribuído para a entrada.

No exemplo abaixo, definimos um tipo de tabela por índice para conter o nome dos clientes. A partir desse tipo, declaramos uma variável que conterá o nome de cada um dos clientes:

DECLARE -- declaração de cursores CURSOR cs_cliente IS SELECT c.* FROM cliente c; -- declaração de tipos

TYPE TNomeCliente IS TABLE OF VARCHAR2(1024) INDEX BY BINARY_INTEGER;

-- declaração de variáveis cCli TNomeCliente;

vCount BINARY_INTEGER := 0; BEGIN

FOR csc IN cs_cliente LOOP -- Incrementa contador vCount := vCount + 1; -- Atribuição de valores cCli(vCount) := csc.cli_st_nome; END LOOP; END; /

No exemplo acima, utilizamos um contador para gerar o índice, mas poderíamos utilizar o próprio código do cliente como índice, uma vez que ele é numérico e o índice não precisa ser utilizado na seqüência, como no exemplo abaixo:

DECLARE -- declaração de cursores CURSOR cs_cliente IS SELECT c.* FROM cliente c; -- declaração de tipos

TYPE TNomeCliente IS TABLE OF VARCHAR2(1024) INDEX BY BINARY_INTEGER;

-- declaração de variáveis cCli TNomeCliente; BEGIN

-- Percorrer todos os clientes do cadastro FOR csc IN cs_cliente LOOP

-- Atribuição de valores

cCli(csc.cli_in_codigo) := csc.cli_st_nome; END LOOP;

END; /

Referenciando valores em uma tabela por índice

Para referenciar uma entrada específica em uma tabela por índice, você especifica um valor de índice, usando a mesma sintaxe do tipo array que usou ao inserir os dados. Por exemplo, para avaliar se o cliente da entrada 2 é novo, basta escrever uma declaração IF como esta:

IF cCli(2).Novo THEN ...

... END IF;

ou

IF cCli(2).Novo = TRUE THEN ...

... END IF;

(Referencie um valor do tipo BOOLEAN como preferir!)

valores de índices para os quais não há entrada. Se tentar referenciar um deles, você tem um exceção NO_DATA_FOUND e, conseqüentemente, poderá tratar essa exceção. Caso não queira utilizar a área de EXCEPTION para tratar essa exceção, você pode utilizar o método EXISTS da coleção, como mostrado abaixo:

IF cCli.EXISTS(15) THEN ...

... END IF;

Um método é uma função ou um procedimento que é anexado a um objeto. Neste caso, a tabela cCli é o objeto e a função EXISTS é o método.

Alterando entradas de tabela

Você atualiza uma tabela PL/SQL de modo semelhante ao que você faz para inserir. Se você já inseriu um número de linha 10 na tabela cCli (usada no nosso exemplo), então você pode atualizar aquela mesma linha com uma declaração como esta:

cCli(10).Nome := 'Grupo Carrefour';

Essa declaração atualiza o campo Nome do registro na entrada da tabela de número 10, com o texto 'Grupo Carrefour'.

Excluindo entradas de tabela

Você pode excluir entradas de uma tabela invocando o método DELETE, que pode excluir uma entrada, um intervalo de entradas ou todas as entradas, da tabela. A sintaxe para o método DELETE é a seguinte:

table_name.DELETE[(primeira_entrada[,ultima_entrada])]; onde:

table_name é o nome da variável de tabela;

primeira_entrada é o índice da entrada que você quer excluir ou o índice da primeira entrada

de um intervalo de entradas que você quer excluir;

ultima_entrada é o último índice de um intervalo de entradas que você quer excluir.

IMPORTANTE: A invocação do método DELETE sem a passagem de nenhuma argumento, faz com que todos os dados sejam excluídos da tabela.

Então:

➢ Para limpar toda tabela cCli, basta executar a declaração: cCli.DELETE;

➢ Para apagar apenas a entrada 8 da tabela cCli, basta executar a declaração: cCli.DELETE(8);

➢ E para apagar as entradas de 6 a 10 da tabela cCli, execute a declaração: cCli.DELETE(6,10);

No documento Treinamento. Sumário (páginas 83-87)

Documentos relacionados