Шаг 58 - PL/SQL - PL/SQL таблицы и их атрибуты

С таблицами PL/SQL мы познакомились, теперь разберем их атрибуты. Атрибуты таблиц имеют следующий синтаксис:

-------- таблица.атрибут ---------------

Где таблица - это ссылка на таблицу PL/SQL, а атрибут - собственно сам атрибут. Основные атрибуты таблиц PL/SQL следующие:

АтрибутВозвращаемый типОписание
COUNTNUMBERВозвращает число строк таблицы.
DELETE-Удаляет строки таблицы.
EXISTSBOOLEANВозвращает TRUE если указанный элемент находится в таблице иначе FALSE.
FIRSTBINARY_INTEGERВозвращает индекс первой строки таблицы.
LASTBINARY_INTEGERВозвращает индекс последней строки таблицы.
NEXTBINARY_INTEGERВозвращает индекс строки таблицы, которая следует за указанной строкой.
PRIORBINARY_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 не существует. Что и продемонстрировал наш пример. Следующие атрибуты разберем далее... :) А, пока запоминайте и анализируйте.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 02.11.2003