Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да използвате Oracle PLSQL таблици (асоциативен масив или таблица по индекс)

Oracle PLSQL таблици

  • PLSQL таблиците са съставни типове данни.
  • Те се държат по същия начин като масивите, с изключение на това, че нямат горни граници, което им позволява постоянно да се разширяват.
  • Те също се наричат ​​индекс по таблица
  • PLSQL таблицата съдържа два елемента

(1) Първичен ключ от типове данни BINARY_INTEGER, които индексират таблицата, които не трябва да са последователни. Колекцията се разширява чрез присвояване на стойности на елемент с помощта на стойност на индекс, която в момента не съществува.
можем да индексираме и по стойност на низ

(2) Колона от скаларен или запис тип данни, която съхранява индекса по елементи на таблица

Как да дефинирате и декларирате тип таблица

За да създадете PL/SQL таблици, правите две стъпки. Първо, вие дефинирате тип TABLE, след което декларирате PL/SQL таблици от този тип. Можете да дефинирате типове TABLE в декларативната част на всеки блок, подпрограма или пакет, използвайки синтаксиса

Syntax 
 TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;

Ако типът на елемента е тип запис, всяко поле в записа трябва да има скаларен тип данни, като CHAR, DATE или NUMBER.

За да посочите типа елемент, можете да използвате %TYPE, за да предоставите типа данни на променлива или колона на базата данни

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;

Можете да добавите ограничението NOT NULL към дефиницията на тип TABLE и така да предотвратите съхраняването на нули в PL/SQL таблици от този тип:

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;

Можете също да използвате %ROWTYPE, за да посочите типа елемент.

DECLARE 
 TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

използвате тип ЗАПИС, дефиниран от потребителя, за да посочите типа на елемента:

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;

След като дефинирате тип TABLE, можете да декларирате PL/SQL таблици от този тип

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

PLSQL таблица атрибути или метод

PL/SQL таблица има атрибутите EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT и DELETE.

Те правят PL/SQL таблиците по-лесни за използване и вашите приложения по-лесни за поддръжка.

plsql_table_name.attribute_name

Атрибутите съществуват, PRIOR, NEXT и DELETE приемат параметри. Всеки параметър трябва да бъде израз, който дава стойност BINARY_INTEGER или стойност, имплицитно конвертируема към този тип данни.

DELETE действа като процедура, която се извиква като оператор. Въпреки това, другите атрибути на таблицата PL/SQL действат като функция, която се извиква като част от израз.

Съществува(n) Върнете true, ако съществува n-ти елемент в таблицата
брой Връщане на броя на елементите в таблицата
Първо и последно FIRST и LAST връщат първото и последното (най-малкото и най-голямото) индексно число в PL/SQL таблица
ПРЕДИШЕН(n ) връща номера на индекса, който предхожда индекс n в PL/SQL таблица
СЛЕДВАЩ(n ) връща номера на индекса, който следва индекс n
Изтриване DELETE премахва всички елементи от PL/SQL таблица. ИЗТРИВАНЕ(n ) премахва n ти елемент. Ако n е нула, DELETE(n ) не прави нищо. ИЗТРИВАНЕ(mn ) премахва всички елементи в диапазона m .. n . Ако m е по-голямо от n или ако m или n е нула, DELETE(mn ) не прави нищо

PL/SQL таблици за преместване на групови данни в и извън таблици на база данни или между приложения от страна на клиента и съхранени подпрограми.

Как да попълним данните в PLSQL таблица

Таблици с прости типове данни могат да бъдат попълнени като:

<variable>(<integer>) := <value>;

Таблиците със сложни типове данни ще се нуждаят от колоните, попълнени поотделно като:

<variable>(<integer>).<column_name> := <value>;

Или от курсор:

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’’;

Можете да извлечете данни на Oracle в PL/SQL таблица и по други три начина

a) Изразът SELECT INTO ви позволява да изберете един ред данни

Използвайки оператора SELECT INTO, можете да изберете запис на колона в скаларен елемент. Или можете да изберете цял ред в елемент на запис. В следващия пример избирате ред от таблицата на базата данни dept в запис, съхранен от първия елемент на 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;

б)  изявление FETCH

С израза FETCH можете да извлечете цяла колона от данни на Oracle в PL/SQL таблица със скалари.

Или можете да извлечете цяла таблица с данни на Oracle в 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;

в) цикълът на курсора FOR ви позволява да извличате няколко реда.

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;

Трябва да прочетете тези други публикации на PLSQL

Структура и типове блокове на Oracle PLSQL
Записи на Oracle PLSQL
Въпроси за интервю за Oracle plsql
Бързи уроци за Oracle sql и plsql


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте и конфигурирайте Oracle Linked Server в SQL Server

  2. Намиране на последния индекс на низ в Oracle

  3. Филтриране на регистрационни файлове за предупреждения в EM13c

  4. Oracle ORA-30004 при използване на функция SYS_CONNECT_BY_PATH,

  5. Заявете две таблици от различни схеми