
Август 2004
Тема номера: «Сделано в России»
Полтавский П. В.
разработчик ПО
Компания : www.cgprojects.ru
Home Page: www.ppv.newmail.ru
Использование S-пакетов при разработке приложений.
Пакет стандартных информационных функций (Standart Functions Package, далее по тексту S-пакет) – содержит набор информационных методов (функций), предназначенных для возвращения значений всех атрибутов записи таблицы по значению первичного ключа. Применение информационных функций является весьма полезным по следующим причинам:
-
метод определения информации, содержащейся в записи таблицы, локализован в ОДНОЙ функции S-пакета, что позволяет сделать программный код приложения более компактным;
-
позволяет использовать стандартный подход при написании программного кода приложения (т. е. применять информационные функции для определения множества значений всех полей записи таблицы по значению её первичного ключа).
Рассмотрим использование ИФ на следующем примере. Демонстрационная таблица служащих EMP имеет следующую структуру
|
Название столбца
|
Тип данных
|
|
EMPNO (Первичный ключ)
|
NUMBER(4)
|
|
ENAME
|
VARCHAR2(10)
|
|
JOB
|
VARCHAR2(9)
|
|
MGR
|
NUMBER(4)
|
|
HIREDATE
|
DATE
|
|
SAL
|
NUMBER(7,2)
|
|
COMM
|
NUMBER(7,2)
|
|
DEPTNO
|
NUMBER(2)
|
и содержит множество записей с информацией о служащих:
|
EMPNO
|
ENAME
|
JOB
|
MGR
|
HIREDATE
|
SAL
|
COMM
|
DEPTNO
|
|
7369
|
SMITH
|
CLERK
|
7902
|
17-DEC-80
|
800
|
200
|
20
|
|
7499
|
ALLEN
|
SALESMAN
|
7698
|
20-FEB-81
|
1600
|
300
|
30
|
|
7521
|
WARD
|
SALESMAN
|
7698
|
22-FEB-81
|
1250
|
500
|
30
|
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
Предположим, что нам необходимо получить величину заработной платы служащего с именем SMITH по значению его внутреннего номера EMPNO=7369. Один из наиболее распространенных фрагментов PL/SQL кода (представлен в виде функции), реализующий эту задачу, приводится ниже.
FUNCTION Get_Sal (p_empno IN NUMBER) RETURN NUMBER
IS
v_sal NUMBER; -- переменная для сохранения значения зарплаты
BEGIN
select Sal
into v_sal
from EMP
where empno=7369;
--
return v_sal;
EXCEPTION
WHEN … THEN
-- код обработки ошибок
…
…
return v_sal;
END;
Основным недостатком такого подхода является то, что для получения значения какого-либо другого атрибута записи таблицы EMP (например, должности служащего JOB) необходимо создавать ещё одну функцию, аналогичную функции Get_Sal. Очевидно, что в случае большого количества атрибутов, число функций также может быть велико.
Теперь рассмотрим вариант с использованием информационных функций S-пакета. Ниже приводится фрагмент PL/SQL кода определения этого пакета.
CREATE OR REPLACE PACKAGE BODY S_METHODS AS
…
…
FUNCTION Get_Emp_Attr(p_empno in NUMBER)
RETURN Emp_TP is
v_attr Emp_TP;
begin
for rec in (select EMPNO ,
ENAME ,
JOB ,
MGR ,
HIREDATE ,
SAL ,
COMM ,
DEPTNO
from Emp
where empno = p_empno)
loop
v_attr:=rec;
end loop;
--
return v_attr;
end;
…
…
END S_METHODS;
/
Воспользуемся функцией S_METHODS.Get_Emp_Attr для определения зарплаты служащего SMITH, для чего рассмотрим PL/SQL блок кода, приведенный ниже.
DECLARE
-- Переменная для сохранения ВСЕЙ информации о служащем SMITH
v_emp_attr S_METHODS.EMP_TP;
BEGIN
-- Вызванная функция заполняет переменную v_emp_attr
-- значениями ВСЕХ атрибутов записи о служащем SMITH
v_emp_attr:=S_METHODS.Get_Emp_Attr(7369);
-- Теперь мы можем ссылаться на значения каждого атрибута полученной записи
-- о служащем. Например, величина зарплаты определяется как v_emp_attr.Sal,
-- должность - v_emp_attr.Job, № департамента - v_emp_attr.Deptno, и т. д.
-- Вся информация о служащем хранится в ОДНОЙ переменной (v_emp_attr), что является
-- весьма удобным.
END;
На основе вышеизложенного можно сделать следующий вывод: использование информационных функций S-пакетов позволяет сделать PL/SQL код приложения достаточно компактным и обладающим высокой степенью модульности.
|