Опубликован: 25.07.2012 | Доступ: свободный | Студентов: 1547 / 45 | Оценка: 4.80 / 4.60 | Длительность: 07:59:00
Дополнительный материал 1:

Приложение А. Пример генератора пакетов PL/SQL

< Лекция 9 || Дополнительный материал 1: 1234

Разработанный вручную код

В коде приложения всегда содержится код, который надо разработать вручную. Прежде чем рассмотреть код тела сгенерированного пакета для лучшего его понимания изучим применяемые разработанные вручную пакеты. Это два пакета types и pkg_lib, которые вызываются из генерируемых пакетов.

Пакет types содержит только объявление ссылки на курсор REF CURSOR. Она используется в тех процедурах пакета, где требуется извлечь записи - результат запроса SELECT. Это сделано таким образом, чтобы другое приложение, например веб-страница, могла вызвать нужную ей процедуру и получить соответствующий набор записей.

create or replace package types is
  type ref_cursor is REF CURSOR;
end types;
    

В пакете pkg_lib содержатся функции работы со строками. Используются они для формирования отдельных частей запросов SELECT.

fun_add_equal формирует часть строки запроса с условием выбора в виде "and column1 = value1". Имеет параметр p_def, хранящий значение (value), при равенстве которому p_ value функция возвращает пустой результат. Это позволяет по необходимости включать/выключать условия фильтрации для разных полей.
fun_add_equal_m1 делает то же самое, что и предыдущая функция, но параметр p_def принимает значение "-1".
fun_add_like выводит условие фильтрации поля в виде "and column1 like '%value1%'". Если параметр p_value пустой, то функция возвращает пустой результат.
fun_sorting_query выводит условие сортировки вида "order by column1 <asc/desc>".

Спецификация пакета pkg_lib:

create or replace package pkg_lib as

function fun_add_equal(p_name varchar2, p_value varchar2, p_def varchar2) return varchar2;

function fun_add_equal_m1(p_name varchar2, p_value varchar2) return varchar2;

function fun_add_like(p_name varchar2, p_value varchar2) return varchar2;

function fun_sorting_query(p_order_by varchar2, p_order_type varchar2, p_def varchar2) return varchar2;

end pkg_lib;
    
Пример A.4.

Тело пакета pkg_lib:

create or replace package body pkg_lib as

function fun_add_equal(p_name varchar2, p_value varchar2, p_def varchar2) return varchar2 is 
         p_result varchar2(2000 char):='';
         begin
              if p_value <> p_def then
                 p_result := p_result || 'and ' || p_name || ' = ' || '''' || p_value || '''';
              end if; 
              return p_result;
         end;
         
function fun_add_equal_m1(p_name varchar2, p_value varchar2) return varchar2 is
         begin
              return fun_add_equal(p_name, p_value, '-1');
         end;
         
function fun_add_like(p_name varchar2, p_value varchar2) return varchar2 is 
         p_result varchar2(2000 char):='';
         begin
              if length(p_value) > 0 then
                 p_result := p_result || ' and lower (' || p_name || ') like lower (''%' || p_value || '%'')';
              end if; 
              return p_result;
         end;
         
function fun_sorting_query(p_order_by varchar2, p_order_type varchar2, p_def varchar2) return varchar2 is
         p_result varchar2(2000 char) :=' order by ';
         p_order_temp varchar2(2000 char);
         p_type_temp varchar2(2000 char);
         begin
            if length(p_order_by) > 0 then
               p_order_temp := p_order_by;
            else
                p_order_temp := p_def;
            end if;
            if length(p_order_type) > 0 then
               p_type_temp := p_order_type;
            else
                p_type_temp := 'asc';
            end if;
            return p_result || ' ' || p_order_temp || ' ' || p_type_temp;
         end;  
         
end pkg_lib;
    
Пример A.5.
< Лекция 9 || Дополнительный материал 1: 1234
Евгений Шаров
Евгений Шаров
Россия, Североморск, школа№11, 1991