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

Como usar o Oracle PLSQL Tables (matriz associativa ou tabela index-by)

Tabelas Oracle PLSQL

  • Tabelas PLSQL são tipos de dados compostos.
  • Eles se comportam da mesma maneira que os arrays, exceto que não têm limites superiores, permitindo que eles se estendam constantemente.
  • Eles também são chamados de índice por tabela
  • A tabela PLSQL contém dois elementos

(1) Uma chave primária de tipos de dados BINARY_INTEGER que indexam a tabela, que não precisam ser consecutivos. A coleção é estendida atribuindo valores a um elemento usando um valor de índice que não existe atualmente.
também podemos indexar por um valor de string

(2) Uma coluna de tipo de dados escalar ou registro que armazena o índice por elementos de tabela

Como definir e declarar o tipo de tabela


Para criar tabelas PL/SQL, você executa duas etapas. Primeiro, você define um tipo TABLE e, em seguida, declara as tabelas PL/SQL desse tipo. Você pode definir tipos de TABLE na parte declarativa de qualquer bloco, subprograma ou pacote usando a sintaxe
Syntax 
 TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;

Se o tipo de elemento for um tipo de registro, cada campo no registro deverá ter um tipo de dados escalar, como CHAR, DATE ou NUMBER.

Para especificar o tipo de elemento, você pode usar %TYPE para fornecer o tipo de dados de uma variável ou coluna de banco de dados
DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;

Você pode adicionar a restrição NOT NULL a uma definição de tipo TABLE e assim evitar o armazenamento de nulos em tabelas PL/SQL desse tipo:
DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;

Você também pode usar %ROWTYPE para especificar o tipo de elemento.
DECLARE 
 TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

você usa um tipo RECORD definido pelo usuário para especificar o tipo de elemento:
DECLARE 
 TYPE emp_phonetyp IS RECORD
 (
 Stdcode      PLS_INTEGER,
 phn_number   PLS_INTEGER,
 extension    PLS_INTEGER
 );
 TYPE emp_contact IS TABLE OF emp_phonetyp INDEX BY BINARY_INTEGER;

Depois de definir um tipo TABLE, você pode declarar tabelas PL/SQL desse tipo
DECLARE   
 TYPE SalTabTyp IS TABLE OF emp.sal%TYPE 
 INDEX BY BINARY_INTEGER;
 TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
 INDEX BY BINARY_INTEGER;
 sal_tab SalTabTyp;  -- declare PL/SQL table
 emp_tab EmpTabTyp;  -- declare another PL/SQL table

Atributos ou Método da Tabela PLSQL


Uma tabela PL/SQL tem os atributos EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT e DELETE.

Eles tornam as tabelas PL/SQL mais fáceis de usar e seus aplicativos mais fáceis de manter.
plsql_table_name.attribute_name

Os atributos existem, PRIOR, NEXT e DELETE recebem os parâmetros. Cada parâmetro deve ser uma expressão que produza um valor BINARY_INTEGER ou um valor implicitamente conversível para esse tipo de dados.

DELETE age como um procedimento, que é chamado de instrução. No entanto, os outros atributos da tabela PL/SQL agem como uma função, que é chamada como parte de uma expressão.
Existe(n) Retorna true se o enésimo elemento na tabela existir
contagem Retorne o número de elementos na tabela
Primeiro e último FIRST e LAST retornam o primeiro e o último (menor e maior) números de índice em uma tabela PL/SQL
PRIOR(n ) retorna o número do índice que precede o índice n em uma tabela PL/SQL
PRÓXIMO(n ) retorna o número do índice que sucede ao índice n
Excluir DELETE remove todos os elementos de uma tabela PL/SQL. APAGAR(n ) remove o n º elemento. Se n é nulo, DELETE(n ) faz nada. APAGAR(mn ) remove todos os elementos no intervalo m .. n . Se m é maior que n ou se m ou n é nulo, DELETE(mn ) não faz nada

Tabelas PL/SQL para mover dados em massa para dentro e fora de tabelas de banco de dados ou entre aplicativos do lado do cliente e subprogramas armazenados.

Como preencher os dados na tabela PLSQL


Tabelas com tipos de dados simples podem ser preenchidas como:
<variable>(<integer>) := <value>;

As tabelas com tipos de dados complexos precisarão das colunas preenchidas individualmente como:
<variable>(<integer>).<column_name> := <value>;

Ou de um cursor:
fetch <cursor_name> into <variable>(<integer>);
Type emptabletype  is table of varchar2(10)
Index by binary_integer;
emp_table emptabletyp;
emp_table (1) := ‘good’;
emp_table (2) := ‘bad’’;

Você pode recuperar dados Oracle em uma tabela PL/SQL de outras três maneiras também

a)A instrução SELECT INTO permite selecionar uma única linha de dados

Usando a instrução SELECT INTO, você pode selecionar uma entrada de coluna em um elemento escalar. Ou você pode selecionar uma linha inteira em um elemento de registro. No exemplo a seguir, você seleciona uma linha da tabela de banco de dados dept em um registro armazenado pelo primeiro elemento da tabela PL/SQL dept_tab:
DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = 'ACCOUNTING' THEN ...
...
END;

b) Declaração FETCH

Com a instrução FETCH, você pode buscar uma coluna inteira de dados Oracle em uma tabela PL/SQL de escalares.

Ou você pode buscar uma tabela inteira de dados Oracle em uma tabela de registros PL/SQL.
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by ith element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
-- process data record
END LOOP;
CLOSE c1;
END;

c) cursor FOR loop permite buscar várias linhas.
DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab SalTabTyp;
n BINARY_INTEGER := 0;
BEGIN
/* Fetch entire columns into PL/SQL tables. */
FOR emp_rec IN (SELECT ename, sal FROM emp) LOOP
n := n + 1;
ename_tab(n) := emp_rec.ename;
sal_tab(n) := emp_rec.sal;
END LOOP;
...
END;

Você deve ler estas  outras postagens PLSQL

Estrutura e tipos de bloco Oracle PLSQL
Registros Oracle PLSQL
Perguntas da entrevista sobre Oracle plsql
Tutoriais rápidos sobre Oracle sql e plsql