Записи и коллекции в PL/SQL, страница 3

2.1.1. Объявление ассоциативных массивов

TYPE имя_типа_таблицы IS TABLE OF тип_данных [NOT NULL]

   INDEX BY [BINARY_INTEGER | подтип_тип BINARY_INTEGER | VARCHAR2(размер)];

§ скалярный тип данных – любой поддерживаемый PL/SQL скалярный тип

§ тип данных с привязкой – определяется ранее объявленной переменной или курсором

TYPE t_ord IS TABLE OF ord %ROWTYPE

   INDEX BY VARCHAR2(20);

TYPE t_sal_nm IS TABLE OF sal.sname%TYPE  NOT NULL

   INDEX BY BINARY_INTEGER;

До Oracle9iRelease 2

INDEX BY   BINARY_INTEGER

Теперь появились дополнительные возможности:

INDEX BY   PLS_INTEGER

INDEX BY   NATURAL

INDEX BY   POSITIVE

INDEX BY   VARCHAR2(размер)

INDEX BY   таблица.столбец%TYPE

INDEXBY   пакет.переменная%TYPE

INDEXBY   подтип

имя_коллекции    табличный_тип;

CREATE OR REPLACE PACKAGE sal_pkg  IS

TYPE t_sal_nm IS TABLE OF sal.sname%TYPE  NOT NULL

   INDEX BY BINARY_INTEGER;

t_salNm  t_sal_nm;

END sal_pkg;


   2.1.2. Объявление вложенной таблицы или массива VARRAY

Синтаксис задания в базе данных:

CREATE  [OR REPLACE]  TYPE имя_типа  AS | IS

TABLE OF тип_данных_элемента [NOT NULL];

CREATE  [OR REPLACE]  TYPE имя_типа  AS | IS

VARRAY (максимальный_индекс) OFтип_данных_элемента  [NOTNULL];

Для задания типов в программе PL/SQL

TYPE имя_типа  IS TABLE OF тип_данных_элемента [NOT NULL];

TYPEимя_типаISVARRAY (максимальный_индекс)

OFтип_данных_элемента  [NOTNULL];

CREATE  TYPE Sal_city_t  AS TABLE OF VARCHAR2(30);

DECLARE

TYPE Number_t  IS ARRAY(5) OF NUMBER;

my_city              Sal_city_t ;

my_number      Number_t  :=  Number_t(7,19);

. . .

END;

2.2. Использование коллекций

2.2.1. Коллекция как компонент записи

DECLARE

TYPE Number_r  IS RECORD (

Id_rec                 NUMBER(4),

my_number      Number_t );

. . .

END;

2.2.2. Коллекция как параметр программы

CREATE PROCEDURE show_color1(p_Color IN Color_t) IS

tCol   Color_t := p_Color;

BEGIN

IF (tCol.count>0  AND  tCol.exists(1)) THEN

     DBMS_OUTPUT.PUT_LINE(‘Color(1) is ’|| tCol(1));

END IF;

END;

2.2.3. Коллекция как тип данных, возвращаемый функцией

CREATE or replace FUNCTION get_ch  RETURN  Ch_Name_t  IS

  tChName   Ch_Name_t;