Август 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 код приложения достаточно компактным и обладающим высокой степенью модульности.

E-mail this page