PL / SQL - Arrays

Neste capítulo, discutiremos arrays em PL / SQL. A linguagem de programação PL / SQL fornece uma estrutura de dados chamada deVARRAY, que pode armazenar uma coleção sequencial de tamanho fixo de elementos do mesmo tipo. Um varray é usado para armazenar uma coleção ordenada de dados; entretanto, geralmente é melhor pensar em uma matriz como uma coleção de variáveis ​​do mesmo tipo.

Todos os varrays consistem em localizações de memória contíguas. O endereço mais baixo corresponde ao primeiro elemento e o endereço mais alto ao último elemento.

Um array é uma parte dos dados do tipo de coleção e significa arrays de tamanho variável. Estudaremos outros tipos de coleção em um capítulo posterior'PL/SQL Collections'.

Cada elemento em um varraytem um índice associado a ele. Ele também tem um tamanho máximo que pode ser alterado dinamicamente.

Criação de um tipo Varray

Um tipo varray é criado com o CREATE TYPEdeclaração. Você deve especificar o tamanho máximo e o tipo de elementos armazenados no varray.

A sintaxe básica para criar um tipo VARRAY no nível do esquema é -

CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>

Onde,

  • varray_type_name é um nome de atributo válido,
  • n é o número de elementos (máximo) no varray,
  • element_type é o tipo de dados dos elementos da matriz.

O tamanho máximo de um varray pode ser alterado usando o ALTER TYPE declaração.

Por exemplo,

CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10); 
/ 

Type created.

A sintaxe básica para criar um tipo VARRAY em um bloco PL / SQL é -

TYPE varray_type_name IS VARRAY(n) of <element_type>

Por exemplo -

TYPE namearray IS VARRAY(5) OF VARCHAR2(10); 
Type grades IS VARRAY(5) OF INTEGER;

Vamos agora trabalhar em alguns exemplos para entender o conceito -

Exemplo 1

O programa a seguir ilustra o uso de varrays -

DECLARE 
   type namesarray IS VARRAY(5) OF VARCHAR2(10); 
   type grades IS VARRAY(5) OF INTEGER; 
   names namesarray; 
   marks grades; 
   total integer; 
BEGIN 
   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); 
   marks:= grades(98, 97, 78, 87, 92); 
   total := names.count; 
   dbms_output.put_line('Total '|| total || ' Students'); 
   FOR i in 1 .. total LOOP 
      dbms_output.put_line('Student: ' || names(i) || ' 
      Marks: ' || marks(i)); 
   END LOOP; 
END; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Total 5 Students 
Student: Kavita  Marks: 98 
Student: Pritam  Marks: 97 
Student: Ayan  Marks: 78 
Student: Rishav  Marks: 87 
Student: Aziz  Marks: 92 

PL/SQL procedure successfully completed.

Please note -

  • No ambiente Oracle, o índice inicial para varrays é sempre 1.

  • Você pode inicializar os elementos varray usando o método construtor do tipo varray, que tem o mesmo nome do varray.

  • Varrays são arrays unidimensionais.

  • Um varray é automaticamente NULL quando é declarado e deve ser inicializado antes que seus elementos possam ser referenciados.

Exemplo 2

Os elementos de um varray também podem ser um% ROWTYPE de qualquer tabela do banco de dados ou% TYPE de qualquer campo da tabela do banco de dados. O exemplo a seguir ilustra o conceito.

Usaremos a tabela CUSTOMERS armazenada em nosso banco de dados como -

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

O exemplo a seguir faz uso de cursor, que você estudará em detalhes em um capítulo separado.

DECLARE 
   CURSOR c_customers is 
   SELECT  name FROM customers; 
   type c_list is varray (6) of customers.name%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter + 1; 
      name_list.extend; 
      name_list(counter)  := n.name; 
      dbms_output.put_line('Customer('||counter ||'):'||name_list(counter)); 
   END LOOP; 
END; 
/

Quando o código acima é executado no prompt SQL, ele produz o seguinte resultado -

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed.