С таблицами 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 не существует. Что и продемонстрировал наш пример. Следующие атрибуты разберем далее... :) А, пока запоминайте и анализируйте.