Информационное обеспечение



бет23/56
Дата05.03.2023
өлшемі256,49 Kb.
#71567
түріПрактикум
1   ...   19   20   21   22   23   24   25   26   ...   56
Псевдофункции коллекций. Псевдофункции коллекций позволяют рабо- тать с коллекциями как таблицами и с таблицами как коллекциями. PL/SQL предлагает четыре псевдофункции (табл. 5).
Таблица 5
Псевдофункции коллекций



Функция

Описание

THE

Представляет значение одного столбца таблицы с типом коллек-
ции в виде виртуальной таблицы. На сегодняшний момент счи- тается устаревшей и не рекомендуется к использованию

CAST

Преобразует коллекцию одного типа в коллекцию другого типа,
например массив VARRAY во вложенную таблицу

MULTISET

Представляет таблицу базы данных в виде коллекции. Исполь- зуя функции CAST и MULTISET, можно получить из запроса
набор строк и преобразовать его в коллекцию

TABLE

Представляет коллекцию в виде таблицы базы данных, что позво-
ляет выполнять запросы к коллекции как к таблице базы данных

Пример использования функций с коллекциями:


DECLARE
lst_child lst_inf_type := lst_inf_type (); BEGIN


DBMS_OUTPUT.put_line ('count in lst_child =' || lst_child.COUNT);
lst_child.EXTEND; lst_child (lst_child.LAST) :=
inf_type ('Анна', TO_DATE ('08.09.2003', 'dd.mm.yyyy')); lst_child.EXTEND;
lst_child (lst_child.LAST) :=
inf_type ('Николай', TO_DATE ('05.06.1996', 'dd.mm.yyyy')); lst_child.EXTEND;
lst_child (lst_child.LAST) :=
inf_type ('Ольга', TO_DATE ('28.11.2000', 'dd.mm.yyyy')); DBMS_OUTPUT.put_line ('Список детей ');

FOR i IN lst_child.FIRST .. lst_child.LAST LOOP


DBMS_OUTPUT.put_line ( i
|| ':'
|| lst_child (i).first_name
|| ':'
|| TO_CHAR (lst_child (i).dater, 'dd.mm.yyyy'));
END LOOP;

DBMS_OUTPUT.put_line ('Дети до пяти лет:');


FOR cd IN (SELECT first_name, TO_CHAR (dater, 'dd.mm.yyyy') dater FROM TABLE (lst_child)
WHERE dater >= TO_DATE ('01.01.2000', 'dd.mm.yyyy') ORDER BY dater)
LOOP
DBMS_OUTPUT.put_line (cd.first_name || ':' || cd.dater); END LOOP;
END;
/
Функция TABLE позволяет использовать мощный инструмент SQL- запросов применительно к коллекциям, что в отличие от последовательной об- работки значительно удобнее.
В следующем примере показано, как можно использовать функции CAST, MULTISET для выборки данных из таблиц в коллекции. Здесь используется тот же тип lst_inf_type, для того чтобы работать со списком сотрудников. Заполнив коллекцию из базы данных, на ее основе получим несколько отчетов. Исполь- зование коллекции сокращает количество обращений к БД, особенно если не только выдаются отчеты, но и выполняется многократное обновление инфор- мации. Например:
DECLARE
lst_empl lst_inf_type := lst_inf_type (); n INTEGER;
BEGIN
-- увеличили размер буфера вывода dbms_output.enable(100000);
SELECT CAST (MULTISET (SELECT first_name, hire_date FROM employees ORDER BY first_name) AS lst_inf_type) INTO lst_empl FROM dual;
DBMS_OUTPUT.put_line ('Список сотрудников: ');

FOR i IN lst_empl.FIRST .. lst_empl.LAST LOOP


DBMS_OUTPUT.put_line ( i
|| ':'
|| RPAD (lst_empl (i).first_name, 20, ' ')
|| ':'
|| TO_CHAR (lst_empl (i).dater, 'dd.mm.yyyy'));
END LOOP;
/* получим список сотрудников, проработавших более десяти лет*/ n := 0;
DBMS_OUTPUT.put_line ('Список сотрудников, проработавших пять и более лет: ');
FOR cd IN (SELECT first_name, TO_CHAR (lc.dater, 'dd.mm.yyyy') dater FROM TABLE (lst_empl) lc
WHERE TRUNC (MONTHS_BETWEEN (SYSDATE, dater) / 12) >= 5
ORDER BY lc.dater) LOOP
n := n + 1;
DBMS_OUTPUT.put_line ( n
|| '.'
|| RPAD (cd.first_name, 20, ' ')
|| ':'
|| cd.dater);
END LOOP;
DBMS_OUTPUT.put_line ('Список сотрудников, принятых в текущем году'); n := 0;
FOR cd IN (SELECT first_name, TO_CHAR (dater, 'dd.mm.yyyy') dater FROM TABLE (lst_empl)
WHERE EXTRACT (YEAR FROM SYSDATE) = EXTRACT
(YEAR FROM dater) ORDER BY dater)
LOOP
n := n + 1;
DBMS_OUTPUT.put_line (n
|| '.'
|| RPAD (cd.first_name, 20, ' ')
|| ':'
|| cd.dater);
END LOOP;
END;
/
Также можно осуществлять выборку данных из коллекции:

CREATE OR REPLACE TYPE a_data IS TABLE OF VARCHAR2(30);


/
DECLARE
v_data a_data := a_data( 'Dmitry', 'Sergei', 'Yulya' ); BEGIN
-- "column_value" – это имя поля, возвращаемого table(cast(collection)) FOR c1 IN (
SELECT column_value name FROM TABLE (CAST( v_data AS a_data)) ) LOOP
DBMS_OUTPUT.PUT_LINE ('Looking for values: ' || c1.name); END LOOP;
END;
/


Достарыңызбен бөлісу:
1   ...   19   20   21   22   23   24   25   26   ...   56




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет