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 ) не прави нищо. ИЗТРИВАНЕ(m , n ) премахва всички елементи в диапазона m .. n . Ако m е по-голямо от n или ако m или n е нула, DELETE(m , n ) не прави нищо |
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