С таблицами PL/SQL мы познакомились, теперь разберем их атрибуты. Атрибуты таблиц имеют следующий синтаксис:
-------- таблица.атрибут ---------------
Где таблица - это ссылка на таблицу PL/SQL, а атрибут - собственно сам атрибут. Основные атрибуты таблиц PL/SQL следующие:
| Атрибут | Возвращаемый тип | Описание |
|---|---|---|
| COUNT | NUMBER | Возвращает число строк таблицы. |
| DELETE | - | Удаляет строки таблицы. |
| EXISTS | BOOLEAN | Возвращает TRUE если указанный элемент находится в таблице иначе FALSE. |
| FIRST | BINARY_INTEGER | Возвращает индекс первой строки таблицы. |
| LAST | BINARY_INTEGER | Возвращает индекс последней строки таблицы. |
| NEXT | BINARY_INTEGER | Возвращает индекс строки таблицы, которая следует за указанной строкой. |
| PRIOR | BINARY_INTEGER | Возвращает индекс строки таблицы, которая предшествует указанной строке. |
Вот основные атрибуты таблиц PL/SQL. Теперь давайте разберем их все на примерах. Начнем по порядку. Атрибут COUNT. Запишем вот такой блок:
SET SERVEROUTPUT ON
-- COUNT
DECLARE
TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
INDEX BY BINARY_INTEGER;
MY_TBL m_SmplTable;
BEGIN
FOR i IN 1..10 LOOP
MY_TBL(i) := TO_CHAR(i+5);
END LOOP;
DBMS_OUTPUT.enable;
DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
END;
/
Получаем:
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2
3 TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
4 INDEX BY BINARY_INTEGER;
5
6 MY_TBL m_SmplTable;
7
8 BEGIN
9
10 FOR i IN 1..10 LOOP
11 MY_TBL(i) := TO_CHAR(i+5);
12 END LOOP;
13
14 DBMS_OUTPUT.enable;
15 DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
16
17 END;
18 /
Count table is: 10
Процедура PL/SQL успешно завершена.
С помощью цикла FOR мы ввели в таблицу 10 значений и применив атрибут - COUNT получили количество записей в таблице. Вот собственно и все. Следующий атрибут DELETE. Тут чуть сложнее. Во-первых, он имеет аргументы:
Рассмотрим для примера такой блок:
SET SERVEROUTPUT ON
-- DELETE
DECLARE
TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
INDEX BY BINARY_INTEGER;
MY_TBL m_SmplTable;
BEGIN
MY_TBL(1) := 'One';
MY_TBL(3) := 'Three';
MY_TBL(-2) := 'Minus Two';
MY_TBL(0) := 'Zero';
MY_TBL(100) := 'Hundred';
DBMS_OUTPUT.enable;
DBMS_OUTPUT.put_line(MY_TBL(1));
DBMS_OUTPUT.put_line(MY_TBL(3));
DBMS_OUTPUT.put_line(MY_TBL(-2));
DBMS_OUTPUT.put_line(MY_TBL(0));
DBMS_OUTPUT.put_line(MY_TBL(100));
DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
MY_TBL.DELETE(100);
DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
MY_TBL.DELETE(1,3);
DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
MY_TBL.DELETE;
DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
END;
/
Получаем:
SQL> SET SERVEROUTPUT ON
SQL> -- DELETE
SQL> DECLARE
2
3 TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
4 INDEX BY BINARY_INTEGER;
5
6 MY_TBL m_SmplTable;
7
8 BEGIN
9
10 MY_TBL(1) := 'One';
11 MY_TBL(3) := 'Three';
12 MY_TBL(-2) := 'Minus Two';
13 MY_TBL(0) := 'Zero';
14 MY_TBL(100) := 'Hundred';
15
16 DBMS_OUTPUT.enable;
17
18 DBMS_OUTPUT.put_line(MY_TBL(1));
19 DBMS_OUTPUT.put_line(MY_TBL(3));
20 DBMS_OUTPUT.put_line(MY_TBL(-2));
21 DBMS_OUTPUT.put_line(MY_TBL(0));
22 DBMS_OUTPUT.put_line(MY_TBL(100));
23 DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
24
25 MY_TBL.DELETE(100);
26 DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
27 MY_TBL.DELETE(1,3);
28 DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
29 MY_TBL.DELETE;
30 DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
31
32 END;
33 /
One
Three
Minus Two
Zero
Hundred
Count table is: 5
Count table is: 4
Count table is: 2
Count table is: 0
Процедура PL/SQL успешно завершена.
В данном случае сначала мы удалили 100-ю запись коллекции, затем с 1 по 3 (при этом 2-й записи не существовало, но это не столь важно) и затем очистили всю коллекцию. Вот так работает атрибут DELETE. И не путайте его с оператором DML DELETE! К стати очистить всю коллекцию целиком, можно и так:
SET SERVEROUTPUT ON
-- DELETE
DECLARE
TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
INDEX BY BINARY_INTEGER;
MY_TBL m_SmplTable;
MY_TBL_Empty m_SmplTable;
BEGIN
MY_TBL(1) := 'One';
MY_TBL(3) := 'Three';
MY_TBL(-2) := 'Minus Two';
MY_TBL(0) := 'Zero';
MY_TBL(100) := 'Hundred';
DBMS_OUTPUT.enable;
MY_TBL := MY_TBL_Empty;
DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
END;
/
Получаем:
SQL> SET SERVEROUTPUT ON
SQL> -- DELETE
SQL> DECLARE
2
3 TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
4 INDEX BY BINARY_INTEGER;
5
6 MY_TBL m_SmplTable;
7 MY_TBL_Empty m_SmplTable;
8
9 BEGIN
10
11 MY_TBL(1) := 'One';
12 MY_TBL(3) := 'Three';
13 MY_TBL(-2) := 'Minus Two';
14 MY_TBL(0) := 'Zero';
15 MY_TBL(100) := 'Hundred';
16
17 DBMS_OUTPUT.enable;
18
19 MY_TBL := MY_TBL_Empty;
20
21 DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
22
23 END;
24 /
Count table is: 0
Процедура PL/SQL успешно завершена.
Как видно, присвоение пустой коллекции, а при обьявлении коллекции это именно так, вся таблица очистилась, за один, заход! Но как это делать на практике судить Вам! :) И последний на этот раз атрибут EXISTS. Рассмотрим такой блок:
SET SERVEROUTPUT ON
-- EXISTS
DECLARE
TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
INDEX BY BINARY_INTEGER;
MY_TBL m_SmplTable;
BEGIN
MY_TBL(1) := 'Miller';
MY_TBL(3) := 'Kolobok';
DBMS_OUTPUT.enable;
DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
IF (MY_TBL.EXISTS(1)) THEN
DBMS_OUTPUT.put_line(MY_TBL(1));
ELSE
DBMS_OUTPUT.put_line('MY_TBL(1) is not exist!');
END IF;
IF (MY_TBL.EXISTS(3)) THEN
DBMS_OUTPUT.put_line(MY_TBL(3));
ELSE
DBMS_OUTPUT.put_line('MY_TBL(3) is not exist!');
END IF;
IF (MY_TBL.EXISTS(2)) THEN
DBMS_OUTPUT.put_line(MY_TBL(2));
ELSE
DBMS_OUTPUT.put_line('MY_TBL(2) is not exist!');
END IF;
END;
/
Далее получаем:
SQL> SET SERVEROUTPUT ON
SQL> -- EXISTS
SQL> DECLARE
2
3 TYPE m_SmplTable IS TABLE OF VARCHAR2(128)
4 INDEX BY BINARY_INTEGER;
5
6 MY_TBL m_SmplTable;
7
8 BEGIN
9
10 MY_TBL(1) := 'Miller';
11 MY_TBL(3) := 'Kolobok';
12
13 DBMS_OUTPUT.enable;
14
15 DBMS_OUTPUT.put_line('Count table is: '||TO_CHAR(MY_TBL.COUNT));
16
17 IF (MY_TBL.EXISTS(1)) THEN
18 DBMS_OUTPUT.put_line(MY_TBL(1));
19 ELSE
20 DBMS_OUTPUT.put_line('MY_TBL(1) is not exist!');
21 END IF;
22
23 IF (MY_TBL.EXISTS(3)) THEN
24 DBMS_OUTPUT.put_line(MY_TBL(3));
25 ELSE
26 DBMS_OUTPUT.put_line('MY_TBL(3) is not exist!');
27 END IF;
28
29 IF (MY_TBL.EXISTS(2)) THEN
30 DBMS_OUTPUT.put_line(MY_TBL(2));
31 ELSE
32 DBMS_OUTPUT.put_line('MY_TBL(2) is not exist!');
33 END IF;
34
35 END;
36 /
Count table is: 2
Miller
Kolobok
MY_TBL(2) is not exist!
Процедура PL/SQL успешно завершена.
Здесь хорошо видно, что в объявленной коллекции существуют только две строки с номером 1 и 3! А строка с номером 2 не существует. Что и продемонстрировал наш пример. Следующие атрибуты разберем далее... :) А, пока запоминайте и анализируйте.