Пользовательские процедуры

реклама
ШАГ
ЗА
ШАГОМ
ОСВОЕНИЕ ПРОГРАММЫ
«ПАРУСПРЕДПРИЯТИЕ 8»
Функциональные расширения
«Пользовательские процедуры»
© ЦКР « П А Р У С »
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Методическое пособие
Содержание
План обучения ....................................................................................................................................4
Сокращения ........................................................................................................................................5
Занятие 1. Введение в язык SQL ......................................................................................................6
Общие сведения ............................................................................................................................. 6
Семантика и синтаксис языка .......................................................................................................6
DDL (Data Definition Language) ................................................................................................ 6
DCL (Data Control Language) ....................................................................................................7
DML (Data Manipulation Language) ..........................................................................................8
Занятие 2. Введение в язык PL/SQL.................................................................................................9
Общие сведения ............................................................................................................................. 9
Семантика и синтаксис языка .......................................................................................................9
Кодовое множество....................................................................................................................9
Лексические единицы ..............................................................................................................10
Разделители .............................................................................................................................. 10
Простые символы .....................................................................................................................11
Составные символы .................................................................................................................11
Идентификаторы ......................................................................................................................12
Зарезервированные слова ........................................................................................................13
Идентификаторы в кавычках ..................................................................................................13
Литералы ...................................................................................................................................14
Числовые литералы..................................................................................................................14
Символьные литералы .............................................................................................................15
Строковые литералы ................................................................................................................15
Булевские литералы .................................................................................................................16
Комментарии ............................................................................................................................ 16
Однострочные комментарии...................................................................................................16
Многострочные комментарии ................................................................................................ 16
Ограничения ............................................................................................................................. 17
Типы данных (основные, производные, неявные типы данных) ........................................17
Преобразования типов данных ............................................................................................... 18
Управляющие структуры (IF, CASE, FOR, LOOP) .............................................................. 19
Применение языка .......................................................................................................................21
Неименованные блоки и хранимые объекты ........................................................................22
Хранимые процедуры ..............................................................................................................22
Хранимые функции .................................................................................................................23
Пакеты .......................................................................................................................................23
Триггеры ...................................................................................................................................24
Занятие 3. Пользовательские процедуры ПП “Парус” .................................................................25
Назначение пользовательских процедур ...................................................................................25
Классификация пользовательских процедур ............................................................................26
Настройка и подключение пользовательских процедур .......................................................... 26
Практическое задание..................................................................................................................44
Разработка пользовательской процедуры “Расчет суммы банковских документов по
контрагенту” ............................................................................................................................. 44
ул. Ярославская, д. 10, корп. 4
2
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Разработка автоматического неименованного блока “Контроль ИНН контрагента” .......45
Занятие 4. Пользовательские задания ПП “ПАРУС” ...................................................................47
Назначение пользовательских заданий......................................................................................47
Настройка и подключение пользовательских заданий ............................................................ 48
Практическое задание..................................................................................................................52
Разработка пользовательского задания “Сбор статистики” ................................................52
ул. Ярославская, д. 10, корп. 4
3
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
План обучения
Количество дней: 4
Продолжительность занятия: 8 часов
№
1
2
3
4
Тема
Занятие 1. Введение в язык SQL
1. Общие сведения
2. Семантика и синтаксис языка
Занятие 2. Введение в язык PL/SQL
1. Общие сведения
2. Семантика и синтаксис языка
3. Применение языка
a. Неименованные блоки
b. Хранимые процедуры
c. Хранимые функции
d. Пакеты
e. Триггеры
Занятие 3. Пользовательские процедуры ПП “ПАРУС”
1. Назначение пользовательских процедур
2. Классификация пользовательских процедур
3. Настройка и подключение пользовательских процедур
4. Практическое задание
a. Разработка пользовательской процедуры “Расчет суммы банковских
документов по контрагенту”
b. Разработка автоматического неименованного блока “Контроль ИНН
контрагента”
Занятие 4. Пользовательские задания ПП “ПАРУС”
1. Назначение пользовательских заданий
2. Настройка и подключение пользовательских заданий
3. Практическое задание
a. Разработка пользовательского задания “Сбор статистики”
ул. Ярославская, д. 10, корп. 4
4
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Сокращения
ПП – программный продукт
ПЗ – пользовательское задание
СУБД – Система Управления Базой Данных
SQL – Structured Query Language (структурированный язык запросов)
DML – Data Manipulation Language (язык манипулирования данными)
DDL – Data Definition Language (язык описания данных)
DCL – Data Control Language (язык контроля данных)
API – Application Programming Interface (программный интерфейс разработчика)
ул. Ярославская, д. 10, корп. 4
5
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Занятие 1. Введение в язык SQL
Общие сведения
Аббревиатура SQL (Structured Query Language) символизирует собой структурированный
язык запросов. Это – язык, который дает возможность создавать и работать с объектами и
данными в реляционных СУБД.
Стандарт SQL определяется ANSI (Американским Национальным Институтом Стандартов)
и ISO (МЕЖДУНАРОДНОЙ ОРГАНИЗАЦИЕЙ ПО СТАНДАРТИЗАЦИИ). Однако,
большинство коммерческих программ баз данных расширяют SQL без уведомления ANSI,
добавляя разные особенности в этот язык. Не является исключением и СУБД Oracle. В
данных методических рекомендациях мы рассмотрим только основные положения языка.
Для более детального изучения работы SQL в СУБД Oracle необходимо обратиться к
документации по СУБД.
Команды, входящие в язык SQL можно разделить на 3 большие группы:
DDL (Data Definition Language) - так называемый Язык Описания Данных в ANSI,
состоит из команд, которые создают объекты (таблицы, индексы, представления,
хранимые процедуры и так далее) в базе данных.
DML (Data Manipulation Language) - это набор команд (Язык Манипулирования
Данными) которые определяют, какие значения представлены в таблицах в любой
момент времени. Это основная часть SQL. Именно с еѐ помощью обрабатываются
данные, хранящиеся в СУБД.
DCL (Data Control Language) состоит из средств, которые определяют права доступа
пользователей в СУБД.
Следует заметить, что это не различные языки, а подразделы команд SQL, сгруппированные
по их функциям.
Семантика и синтаксис языка
Так как SQL разбит на три большие группы команд, обозначенные выше, рассмотрим их
отдельно друг от друга.
DDL (Data Definition Language)
Как следует из названия, данный набор команд языка SQL служит для описания объектов
СУБД. С помощью команд DML можно создавать новые объекты, изменять существующие,
удалять объекты БД. Основные команды языка DML:
CREATE – создание объектов БД. Синтаксис команды зависит от создаваемого
объекта. В общем виде команда выглядит так:
ул. Ярославская, д. 10, корп. 4
6
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
create [or replace] <ТИП_ОБЪЕКТА> <ИМЯ_ОБЪЕКТА> <ОПИСАНИЕ_ОБЪЕКТА>
Пример создания таблицы:
create table UDO_T_ORDERS --талица заказов
(
rn number(17), --уникальный идентификатор
orddate date, --дата заказа
ordnumb varchar2(20), --номер заказа
customer number(17),
summa number(19,2) --сумма заказа
);
Пример создания процедуры:
create procedure P_ORDERS_CALC --хранимая процедура рассчета суммы заказов
(
scustomer varchar2, --мнемокод заказчика
nsumma out number --расчитанная сумма
)
is
begin
select t.summa into nsumma from udo_t_orders t where t.customer=scustomer;
end;
ALTER – изменение объектов БД. Команда служит для модификации существующих
объектов БД. Синтаксис команды зависит от модифицируемого объекта. В общем
виде команда выглядит так:
alter <ТИП_ОБЪЕКТА> <ИМЯ_ОБЪЕКТА> <ИЗМЕНЕНИЯ>
Пример изменения таблицы БД:
alter table UDO_T_ORDERS add constraint UDO_C_ORDERS_RN_PK primary key (RN);
Пример изменения триггера:
alter trigger udo_tr_orders_bi disable; --отключение триггера
alter trigger udo_tr_orders_bi enable; --включение триггера
DROP – удаление объектов БД. С помощью этой команды можно удалять объекты
БД. В общем виде команда выглядит так:
drop <ТИП_ОБЪЕКТА> <ИМЯ_ОБЪЕКТА>
Например, удалить процедуру можно следующим образом:
drop procedure UDO_P_MYPROCEDURE;
DCL (Data Control Language)
С помощью этого набора команд языка SQL, осуществляется разграничение прав доступа к
объектам БД. Здесь основные команды это
GRANT – назначить права доступа. В общем виде команду назначения прав доступа
можно представить так:
grant <ПРАВА|РОЛЬ> [on <ОБЪЕКТ_БД>] to <ПОЛЬЗОВАТЕЛЬ|РОЛЬ> [with admin option]
Например, дать все права на работу с таблицей пользователю можно так:
grant all privileges on UDO_T_ORDERS to IVANOV;
Сделать пользователя администратором БД, с возможностью передачи прав
администратора дочерним пользователям, можно так:
grant DBA to IVANOV with admin option;
Разрешить всем пользователя БД исполнение процедуры:
grant execute on UDO_P_MYPROCEDURE to public;
REVOKE – снять права доступа, служит для отбора прав доступа у ролей и
пользователей БД. В общем виде выглядит так:
revoke <ПРАВА|РОЛЬ> [on <ОБЪЕКТ_БД>] from <ПОЛЬЗОВАТЕЛЬ|РОЛЬ>
ул. Ярославская, д. 10, корп. 4
7
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Например, снятие прав на запуск процедуры у всех пользователей БД:
revoke execute on UDO_P_MYPROCEDURE from public;
DML (Data Manipulation Language)
Этот подраздел языка SQL служит для обработки данных, хранящихся в СУБД. Ниже,
представлены основные команды DML и некоторые примеры их применения.
INSERT – добавление данных в таблицы СУБД. В общем виде команду можно
записать так:
insert into <ТАБЛИЦА> (<ПОЛЕ1>,...,<ПОЛЕN>) values (<ВЫРАЖЕНИЕ1>,...,<ВЫРАЖЕНИЕN>);
Например, добавление записи в таблицу может выглядеть следующим образом:
insert into customers (rn, name) values (1, 'ООО «Фирма»');
UPDATE – исправление данных в таблицах СУБД. Общий вид использования
команды таков:
update <ТАБЛИЦА> set <ПОЛЕ1>=<ВЫРАЖЕНИЕ1>,..., <ПОЛЕN>=<ВЫРАЖЕНИЕN>
[where <УСЛОВИЕ1> [and|or] <УСЛОВИЕN>]
Например, установить нулевую сумму, для всех записей некоторой таблицы, которые
удовлетворяют некоторому условию можно так:
update orders set summa=0 where customer=1
DELETE – удаление данных из таблиц. В общем виде команда выглядит так:
delete from <ТАБЛИЦА> [where <УСЛОВИЕ1> [and|or] <УСЛОВИЕN>]
Например, так можно удалить все записи таблицы:
delete from orders
А так, только те записи таблицы, которые удовлетворяют условию:
delete from orders where summa>100
SELECT – чтение данных из таблиц и представлений СУБД. Это одна из
основополагающих команд SQL. Синтаксис команды SELECT, языка SQL СУБД
Oracle крайне богат. В общем виде простейшую команду SELECT можно представить
так:
select <ВЫРАЖЕНИЕ1>,...,<ВЫРАЖЕНИЕN>
from <ТАБЛИЦА1>,...,<ТАБЛИЦАN>
[where <УСЛОВИЕ1> [and|or] <УСЛОВИЕN>]
[order by [ПОЛЕ1] [asc|desc],...,[ПОЛЕN] [asc|desc]]
Пример выборки данных из таблицы:
select ag.agnabbr, --мнемокод контрагента
ag.agnname --наименование контарегнта
from agnlist ag --таблица контрагентов
where ag.agntype=0 --брать только ЮЛ
Данное методическое руководство не содержит полных сведений о языке SQL СУБД Oracle,
а только общую информацию, поэтому для более подробного изучения команд SQL следует
обратиться к документации СУБД Oracle.
ул. Ярославская, д. 10, корп. 4
8
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Занятие 2. Введение в язык PL/SQL
Общие сведения
Хороший способ познакомиться с PL/SQL - это взглянуть на приведенную ниже программу
и изучить комментарии к коду.
---ПРИМЕР НЕИМЕНОВАННОГО БЛОКА PL/SQL
---Декларативная часть, служит для объявления идентификаторов переменных, констант и подпрограмм
declare
custcity varchar2(50); --переменная, тип - строка длинной 50 символов
bad_city exception; --переменная, тип – исключение, для объявления пользовательских исключений
cursor cur is select cname from customers where city=custcity; --пользовательский тип - курсор (запрос)
rec cur%rowtype; --переменная, тип – неявный, строка курсора CUR
--Тело блока, здесь реализуется алгоритм на языке PL/SQL
begin
--вызов DML операции – DELETE
delete from tmp; --очистка временной таблицы
--управляющая структура IF
if(custcity is null)then –-если переменная CUSTCITY не содержит данных
raise bad_city; --то вызвать исключительную ситуацию (управление передается в блок EXCEPTION)
end if;
--работа с содержимым курсора
open cur; --открыть курсор (исполнить запрос к БД)
loop –-заголовок цикла (начало тела цикла)
fetch cur into rec; --извлечь очередную запись из курсора в переменную REC
exit when cur%notfound; --выйти из цикла если все записи курсора CUR прочитаны
--вызов DML операции INSERT
insert into tmp (str) values (rec.cname); --добавление записи во временную таблицу
end loop; --окончание тела цикла
--если в курсоре не было данных – вызвать исключительную ситуацию NO_DATA_FOUND (данных не найдено)
if (cur%rowcount=0) then raise no_data_found; end if;
--завершить транзакцию
commit;
--Блок обработки исключительных ситуаций (сюда передается управление при вызове исключительной
--ситуации в теле блока)
exception
-–обработка системной исключительной ситуации NO_DATA_FOUND (данных не найдено)
when no_data_found then
insert into tmp (str) values ('Данные не найдены!');
commit;
-–обработка пользовательской исключительной ситуации “неверный город”
when bad_city then
insert into tmp (str) values ('Город задан неверно!');
commit;
end;
PL/SQL не только позволяет вам вставлять, удалять, обновлять и извлекать данные СУБД
Oracle, но и управлять потоком предложений для обработки этих данных. Более того, вы
можете объявлять константы и переменные, определять подпрограммы (процедуры и
функции) и перехватывать ошибки времени выполнения. Таким образом, PL/SQL
комбинирует мощь манипулирования данными SQL с мощью обработки данных
процедурных языков.
Данное методическое руководство не содержит полных сведений о языке PL/SQL СУБД
Oracle, а только общую информацию, поэтому для более подробного изучения команд
PL/SQL следует обратиться к документации СУБД Oracle.
Семантика и синтаксис языка
Кодовое множество
Вы пишете программу PL/SQL как строки текста, используя специфический набор символов.
В этот набор символов входят:
прописные и строчные буквы A .. Z, a .. z
ул. Ярославская, д. 10, корп. 4
9
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
цифры 0 .. 9
символы табуляция, пробел и возврат каретки («пропуски»)
символы ()+-*/<>=!~;:.'@%,»#$^&_|{}?[]
PL/SQL не различает прописных и строчных букв, и рассматривает строчные буквы как
эквиваленты соответствующих прописных букв, исключая строковые и символьные
литералы.
Лексические единицы
Строка текста программы PL/SQL распадается на группы символов, называемые
лексическими единицами, которые можно классифицировать следующим образом:
разделители (простые и составные символы)
идентификаторы, в том числе зарезервированные слова
литералы
комментарии
Например, строка
bonus := salary * 0.10; --вычислить премию
содержит следующие лексические единицы:
идентификаторы bonus и salary
составной символ :=
простые символы * и ;
числовой литерал 0.10
комментарий - вычислить премию
Для улучшения читабельности вы можете разделять лексические единицы пропусками. На
самом деле, вы обязаны разделять соседние идентификаторы пропусками или знаками
пунктуации. Например, следующая строка незаконна, потому что зарезервированные слова
END и IF соединены: IF x > y THEN high := x; ENDIF; - незаконно
Однако вы не можете вставлять пропуски внутри лексических единиц, за исключением
строковых литералов и комментариев. Например, следующая строка незаконна, потому что
составной символ для операции присваивания (:=) разъединен: count : = count + 1; незаконно
Разделители
Разделитель – это простой или составной символ, имеющий в PL/SQL специальный смысл.
Например, вы используете разделители для представления арифметических операций, таких
как сложение и вычитание.
ул. Ярославская, д. 10, корп. 4
10
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Простые символы
Простые символы кодируются как одиночные символы:
+ оператор сложения
- оператор вычитания/отрицания
оператор умножения
/ оператор деления
= оператор сравнения
< оператор сравнения
> оператор сравнения
( ограничитель выражения или списка
) ограничитель выражения или списка
; терминатор предложения
% индикатор атрибута
, разделитель элементов
. селектор компоненты
@ индикатор удаленного доступа
' ограничитель символьной строки
« ограничитель идентификатора
: индикатор хост-переменной
Составные символы
Составные символы кодируются как пары символов:
** оператор возведения в степень
<> оператор сравнения
!= оператор сравнения
~= оператор сравнения
^= оператор сравнения
<= оператор сравнения
>= оператор сравнения
:= оператор присваивания
=> оператор ассоциации
.. оператор интервала
|| оператор конкатенации
<< ограничитель метки
ул. Ярославская, д. 10, корп. 4
11
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
>> ограничитель метки
-- индикатор однострочного комментария
/* (начальный) ограничитель многострочного комментария
*/ (конечный) ограничитель многострочного комментария
Идентификаторы
Вы используете идентификаторы для именования программных объектов и единиц PL/SQL,
к которым относятся константы, переменные, исключения, курсоры, подпрограммы и
пакеты. Некоторые примеры идентификаторов:
X
t2
phone#
credit_limit
LastName
oracle$number
Идентификатор состоит из буквы, за которой (необязательно) следуют одна или несколько
букв, цифр, знаков доллара, подчеркиваний или знаков номера (#). Другие символы, такие
как дефис, наклонная черта или пропуск, в идентификаторе незаконны, как показывают
следующие примеры:
mine&yours - незаконный амперсенд
debit-amount - незаконный дефис
on/off - незаконная косая черта
user id - незаконный пробел
Следующие примеры показывают, что использование в идентификаторах знаков доллара,
подчеркиваний и знаков номера законно:
money$$$tree - законно
SN## - законно
try_again_ - законно
Буквы в идентификаторах могут быть как прописными, так и строчными. PL/SQL не
различает их, за исключением строковых и символьных литералов. Поэтому, если
единственным различием между идентификаторами является регистр соответствующих
букв, то PL/SQL трактует такие идентификаторы как одинаковые, как показывает
следующий пример:
lastname
LastName - то же, что lastname
ул. Ярославская, д. 10, корп. 4
12
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
LASTNAME - то же, что lastname и LastName
Длина идентификатора не может превышать 30 символов. Однако значащим считается
каждый символ в идентификаторе, включая знаки доллара, подчеркивания и знаки номера.
Например, следующие два идентификатора считаются в PL/SQL различными:
lastname
last_name
Идентификаторы должны быть информативными. Поэтому старайтесь использовать
осмысленные
имена,
такие
как
credit_limit
или
cost_per_thousand.
Избегайте
невразумительных имен, подобных cr_lim или cpm.
Зарезервированные слова
Некоторые идентификаторы, называемые зарезервированными словами, имеют специальный
смысл в PL/SQL и не могут быть переопределены. Например, слова BEGIN и END, которые
окружают исполнительную часть блока или подпрограммы, зарезервированы. Как
показывает следующий пример, если вы попытаетесь переопределить зарезервированное
слово, вы получите ошибку компиляции:
DECLARE
end
BOOLEAN;
-
незаконно;
вызовет
ошибку
компиляции.
Однако
заререзированные слова можно включать как составные части в идентификаторы, как
показывает следующий пример: DECLARE end_of_game BOOLEAN; -- законно.
Как правило, зарезервированные слова пишутся прописными буквами, чтобы облегчить
читабельность. Однако это необязательно; как и любые другие идентификаторы PL/SQL,
зарезервированные слова можно кодировать строчными или смешанными буквами.
Предопределенные идентификаторы
Идентификаторы, глобально объявленные в пакете STANRARD, как, например, исключение
INVALID_NUMBER, можно переобъявлять. Однако такое переобъявление может приводить
к ошибкам, потому что глобальное объявление перекрывается вашим локальным
объявлением.
Идентификаторы в кавычках
Для большей гибкости, PL/SQL позволяет вам заключать идентификаторы в двойные
кавычки. Идентификаторы в кавычках необходимы нечасто, но иногда они могут быть
полезными. Такой идентификатор может содержать любую последовательность печатных
символов, включая пробелы, но исключая двойные кавычки. Следовательно, следующие
идентификаторы законны:
«X+Y»
«last name»
ул. Ярославская, д. 10, корп. 4
13
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
«on/off switch»
«employee(s)»
«*** header info ***»
Максимальная длина идентификатора в кавычках составляет 30 символов, не считая
кавычек. Использование в качестве идентификаторов в кавычках зарезервированных слов
PL/SQL допускается, но НЕ рекомендуется. Использование зарезервированных слов
является плохой практикой программирования. Однако, некоторые из зарезервированных
слов PL/SQL не являются зарезервированными в SQL. Например, зарезервированное (в
PL/SQL) слово TYPE допустимо использовать в предложении SQL CREATE TABLE в
качестве имени столбца. Однако, если вы обратитесь к такому столбцу в предложении SQL,
содержащемся в программе PL/SQL, вы получите ошибку, как показывает следующий
пример:
SELECT acct, type, bal INTO ... - вызовет ошибку компиляции
Чтобы предотвратить ошибку компиляции, запишите имя столбца прописными буквами и
заключите его в кавычки:
SELECT acct, «TYPE», bal INTO ...
Нельзя записывать такое имя столбца строчными буквами (если только оно не было так
закодировано в предложении CREATE TABLE). Например, следующее предложение
незаконно:
SELECT acct, «type», bal INTO ... - вызовет ошибку компиляции
Альтернативно, вы можете создать обзор, который переименовывает сомнительный столбец,
а затем использовать этот обзор в предложениях SQL вместо базовой таблицы.
Литералы
Литерал - это явное число, символ, строка или булевское значение, не представленное
идентификатором. Примерами могут служить числовой литерал 147 и булевский литерал
FALSE.
Числовые литералы
В арифметических выражениях могут использоваться два вида числовых литералов:
целочисленные
и
вещественные.
Целочисленный
литерал
-
это
целое
число
с
необязательным знаком и без десятичной точки. Примеры целочисленных литералов: 030 6 14 0 +32767 Вещественный литерал - это целое или дробное число с необязательным знаком
и с десятичной точкой. Примеры вещественных литералов: 6.6667 0.0 -12.0 3.14159 +8300.00
.5 25. PL/SQL рассматривает числа, подобные 12.0 и 25., как вещественные, несмотря на то,
что их значения по сути целочисленные. Числовые литералы не могут содержать знаков
ул. Ярославская, д. 10, корп. 4
14
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
доллара или запятых, но могут записываться в научной нотации. В этой нотации за числом
следует символ E (или e) и необязательное целое со знаком. Например: 2E5 1.0E-7 3.14159e0
-1E38 -9.5e-3 Буква E означает «умножить на десять в степени». Как показывает следующий
пример, число, следующее за E, задает степень десяти, на которую должно быть умножено
число, записанное перед E: 3 5E3 = 5 x 10 = 5 x 1000 = 5000
Следовательно, число за буквой E показывает также, на сколько мест следует передвинуть
десятичную точку. В последнем примере неявная десятичная точка сдвигалась на три
позиции вправо; в следующем примере она сдвигается на три позиции влево: -3 5E-3 = 5 x 10
= 5 x 0.001 = 0.005
Символьные литералы
Символьный литерал - это одиночный символ, окруженный одиночными апострофами.
Примеры:
'Z' '%' '7' ' ' 'z' '('
Символьные литералы включают все печатные символы в наборе символов PL/SQL: буквы,
цифры, пропуски и специальные символы. PL/SQL чувствителен к регистру букв в
символьных литералах. Так, литералы 'Z' и 'z' считаются различными. Не путайте
символьные литералы '0' .. '9' с числовыми литералами. Символьные литералы нельзя
использовать в арифметических выражениях.
Строковые литералы
Символьное значение может быть представлено идентификатором или явно записано в виде
строкового литерала, который должен быть последовательностью из нуля или более
символов, заключенной в апострофы. Ниже приведены примеры строковых литералов:
'Hello, world!'
'XYZ Corporation'
'10-NOV-91'
'He said «Life is like licking honey from a thorn.»'
'$1,000,000'
Все строковые литералы, за исключением пустой строки (''), имеют тип CHAR. Если
необходимо включить апостроф в литерал, его необходимо изображать в виде двойного
апострофа (''), что не то же самое, что двойная кавычка («):
'Don''t leave without saving your work.»
PL/SQL чувствителен к регистру букв в строковых литералах. Например, следующие
литералы считаются различными:
'baker'
ул. Ярославская, д. 10, корп. 4
15
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
'Baker'
Булевские литералы
Булевские литералы - это предопределенные значения TRUE и FALSE, а также «незначение» NULL, которое обозначает отсутствие, неизвестность или неприменимость
значения. Не забывайте, что булевские литералы НЕ являются строками.
Комментарии
Компилятор PL/SQL игнорирует комментарии, но вы не должны следовать его примеру.
Добавление комментариев в вашу программу способствует ее читабельности и облегчает ее
понимание. Обычно комментарии используются для описания назначения и использования
каждого сегмента кода. PL/SQL поддерживает два стиля комментариев: однострочные и
многострочные.
Однострочные комментарии
Однострочный комментарий начинается с двойного дефиса (--) и заканчивается концом
строки. Примеры:
-- начало обработки
SELECT sal INTO salary FROM emp -- взять текущий оклад
WHERE empno = emp_id;
bonus := salary * 0.15; -- вычислить величину премии
Заметьте, что однострочный комментарий может начинаться на одной строке с
предложением (или частью предложения). Во время тестирования или отладки программы
вы можете захотеть временно удалить строку кода. Следующий пример показывает, как вы
можете «закомментировать» строку:
-- DELETE FROM emp WHERE comm IS NULL;
Многострочные комментарии
Многострочный комментарий начинается с пары символов /* и заканчивается парой
символов */. Пример:
/* вычислить 15% премию для
сотрудников с высоким рейтингом */
IF rating > 90 THEN
bonus := salary * 0.15;
END IF;
Этот стиль позволяет, например, легко «закомментировать» секцию блока, которую вы
хотите временно исключить из выполняемого кода, как показывает следующий пример:
ул. Ярославская, д. 10, корп. 4
16
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
/* OPEN c1;
LOOP
FETCH c1 INTO my_empno, my_ename, my_sal;
EXIT WHEN c1%NOTFOUND;
...
END LOOP;
CLOSE c1; */
Ограничения
Нельзя вкладывать комментарии друг в друга. Кроме того, нельзя использовать
однострочные комментарии в том блоке PL/SQL, который будет обрабатываться
динамически программой прекомпилятора ORACLE, потому что в этом случае символы
конца строки игнорируются, и, как следствие, однострочный комментарий растянется до
конца блока, а не только до конца строки. Поэтому в таких случаях используйте
многострочные комментарии.
Типы данных (основные, производные, неявные типы данных)
Каждая константа и переменная имеет тип данных, который специфицирует ее формат
хранения, ограничения и допустимый интервал значений. PL/SQL предусматривает
разнообразие предопределенных скалярных и составных типов данных. Скалярный тип не
имеет внутренних компонент. Составной тип имеет внутренние компоненты, которыми
можно манипулировать индивидуально.
Можно выделить 3 основных типа данных:
NUMBER – число
VARCHAR2 – строка
DATE – дата со временем
Остальные типы данных, являются производными от указанных и отличаются возможным
наличием ограничений по формату и типу хранимых данных.
Например, INTEGER – производный тип данных от NUMBER, предназначенный для
хранения целых числовых значений.
При объявлении некоторых типов данных необходимо указание размерности. Размерность
указывается в круглых скобках, после имени типа. В общем виде синтаксис указания
размерности типа данных выглядит следующим образом:
NUMBER (<РАЗМЕРНОСТЬ>[,<РАЗМЕРНОСТЬ_ДРОБНОЙ_ЧАСТИ>])
VARCHAR2(<РАЗМЕРНОСТЬ>)
Примеры объявления переменных скалярных типов:
ул. Ярославская, д. 10, корп. 4
17
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
declare
n integer; --целое число
r number(17,2); --число с плавающей точкой (15 - целых разрядов, 2 - дробных, общая размерность 17)
s varchar2(200); --строка длиной 200 символов
d date; --дата
begin
null;
end;
Кроме зарезервированных простых типов данных, при программировании на PL/SQL можно
использовать пользовательские и составные типы данных, а так же коллекции. Коллекция,
по сути является динамическим массивом. Для работы с указанными типами данных
используются следующие ключевые слова:
TYPE – указывает на объявление пользовательского типа данных
RECORD – указывает на объявление составного типа данных
TABLE OF – указывает на объявление векторного типа данных (массива, коллекции)
Пример объявления и использования коллекций и составных пользовательских типов
данных:
declare
--объявление составного типа данных
--REC - имя типа данных
--NUMB и FIO - элементы, составляющие тип данных
type rec is record
(
numb number(17), --элемент коллеции, число 17-ти разрядов
fio varchar2(100) --элемент коллеции, строка в 100 символов
);
--объявление коллекции, каждый из элементов которой есть переменная типа REC (пользовательского
составного типа данных)
--ARR - имя типа данных этой коллекции
type arr is table of rec;
--обявление скалярной переменной на основе пользовательского составного типа данных (REC)
r rec;
--обявление векторной переменной на основе типа данных коллекции (ARR)
ra arr;
begin
--обращение к элементам переменной пользовательского составного типа данных
r.numb:=1;
r.fio:='Иванов Иван Иванович';
--инициализация коллекции
ra:=arr(); --создание новой пустой коллекции указанного типа
--наполнение коллекции данными
ra.extend; --добавляем новый пустой элемент типа REC в коллекцию
ra(ra.last).numb:=1; --инициализируем поле NUMB последнего (только что добавленного) элмента
ra(ra.last).fio:='Петров Петр Петрович'; --инициализируем поле FIO последнего (только что
добавленного) элмента
ra.extend;
ra(ra.last).numb:=2;
ra(ra.last).fio:='Сидоров Сидор Сидорович';
--обработка коллекции - цикл с первого(FIRST) по последний (LAST) элементы коллекции RA
for i in ra.first..ra.last loop
--вывод информации об элементе коллекции
dbms_output.put_line('Номер элемента: '||i);
dbms_output.put_line(' Значение поля NUMB: '||ra(i).numb);
dbms_output.put_line(' Значение поля FIO: '||ra(i).fio);
end loop;
end;
Кроме того, в PL/SQL есть возможность объявления переменных, не указывая явно тип
данных, для этого служат ключевые слова TYPE и ROWTYPE, например:
declare
--объявление переменных неявных типов
n agnlist.rn%type; --переменная N имеет тип такой же, как и колонка RN, таблицы AGNLIST
agnrec agnlist%rowtype; --переменная AGNREC составная, еѐ состав соответствует
--набору полей таблицы AGNLSIT
begin
--обращение к элементу AGNREC
ул. Ярославская, д. 10, корп. 4
18
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
agnrec.agnname:=...
end;
Преобразования типов данных
Иногда бывает необходимо преобразовать значение из одного типа данных в другой. PL/SQL
поддерживает как явные, так и неявные (автоматические) преобразования типов данных.
Например, целое число, в число с плавающей точкой может быть преобразовано
автоматически. Строковой литерал '123', в число 123 так же может быть преобразован
автоматически. При необходимости явного преобразования можно использовать встроенные
функции PL/SQL:
TO_NUMBER(<ВЫРАЖЕНИЕ>) – преобразование указанно выражения в число
TO_CHAR(<ВЫРАЖЕНИЕ>) – преобразование указного выражения в строку
TO_DATE(<ВЫРАЖЕНИЕ>, <ФОРМАТ>) – преобразование указанного выражения в
дату указанного формата.
Подробнее об этих функциях и их параметрах можно узнать в документации по Oracle
PL/SQL. Ниже, представлены примеры явных и неявных преобразований типов данных.
declare
n number(19, 2); --число с плавающей точкой
i integer; --целове число
d date; --дата
s1 varchar2(200); --строка
s2 varchar2(200); --строка
begin
-n:=123.5;
i:=n; --в i будет записано 124, неявное преобразование дробного в целое, произошло округление
-s1:='543';
i:=s1; --в i будет записано 543, неявное преобразование строки в число
-s1:='631.345';
n:=to_number(s1); --в n будет записано 631.35, явное преобразование
-s2:='10.01.2009';
d:=to_date(s2, 'dd.mm.yyyy'); --дата 10.01.2009 преобразуется в системный формат хранения даты и
--записывается в d
end;
Управляющие структуры (IF, CASE, FOR, LOOP)
Для управления последовательностью исполнения (логикой алгоритма) команд PL/SQL
можно использовать следующие управляющие структуры:
IF – оператор ветвления
CASE – оператор ветвления
FOR – оператор цикла с известным числом повторений
LOOP – оператор цикла с неизвестным числом повторений
Проще всего понять их работу на простых примерах:
declare
n number;
begin
/*
ВАЖНО: NULL - пустой оператор-заглушка. Использован просто для примера.
Показывает, интерпретатору, что ничего делать не надо.
ул. Ярославская, д. 10, корп. 4
19
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
*/
--- 1. Оператор IF
---1.1 простейший вариант
if(n>10)then --заголовок оператора, n>10 - условие, если TRUE - исполянется тело оператора
--тело оператора
null; --этот код исполняется, если условие заголовка TRUE
end if; --окончание оператора
--1.2 вариант с альтернативной веткой
if(n>10)then --заголовок оператора, 10>1 - условие, если TRUE - исполянется тело оператора
--тело оператора
null; --этот код исполняется, если условие заголовка TRUE
else
--тело альтернативной ветки оператора
null; --этот код исполняется, если условие заголовка FALSE
end if; --окончание оператора
--1.3 альтернативный синтаксис IF-ELSIF
if(n>10)then
null;
elsif(n=0)then --дополнительное условие в альтернативной ветке
null;
else
null;
end if;
--- 2. Оператор CASE
---2.1 основной синтаксис CASE
case n --заголовок оператора, n - проверяемое значение
when 1 then null; --если n=1 выполняется этот набор операторов
when 2 then null; --если n=2 выполняется этот набор операторов
when 3 then null; --если n=3 выполняется этот набор операторов
else null; --если n не 1, 2 или 3 выполняется этот набор операторов
end case; --окончание оператора
--2.2 альтернативнй синтаксис CASE
case --заголовок оператора
when n>10 then null; --n>10 - условие, если условие TRUE - выполняется
when n<10 then null; --n<10 - условие, если условие TRUE - выполняется
when n=10 then null; --n=10 - условие, если условие TRUE - выполняется
else null; --если не отработала ни одна ветка - выполняется этот набор
end case; --окончание оператора
этот набор операторов
этот набор операторов
этот набор операторов
операторов
--- 3. Оператор FOR
---3.1 обработка известного числа повторений
for i in 1..10 loop --заголовок цикла, 10 итераций, на каждой из которых щетчику цикла i
--присваиваются последовательно значения от 1 до 10
--тело цикла
dbms_output.put_line(i); --вывод значения счетчика цикла
end loop; --окончание цикла
--3.2 курсорный цикл FOR (обработка данных БД),
--количество итераций = количество строк, возвращаемых запросом SELECT
--c – счетчик цикла, на каждой итерации указывает на обрабатываемую строку курсора
--обращение к полям текущей записи обрабатываемого курсора – c.<ПОЛЕ>
for c in (
--запрос курсорного цикла
select ag.agnname --берем наименование контрагента (поле курсора)
from agnlist ag --из таблицы контрагентов системы
)
loop
--обращение к полям курсора в теле цикла
dbms_output.put_line(c.agnname);
end loop;
---4. Опертор LOOP
---4.1 цикл с неизвестным числом повторений
ул. Ярославская, д. 10, корп. 4
20
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
n:=0;
loop --заголовок цикла
--тело цикла
n:=n+1;
dbms_output.put_line(n);
exit when (n>=10); --выход из циклв по условию (альтернативный вариант вызхода - if(n>=10)then
exit; end if;
end loop; --окончание цикла
---5. Оператор WHILE
---5.1 цикл с предусловием
n:=0;
while(n<10)loop --заголовок цикла, n<10 -условие выполения,
--если условие TRUE - выполняется тело (до тех пор, пока условие TRUE)
--тело цикла
n:=n+1;
dbms_output.put_line(n);
end loop; --окончание цикла
end;
Применение языка
PL/SQL - это язык, структурированный блоками. Это значит, что основные единицы
(процедуры, функции и анонимные блоки), составляющие программу PL/SQL, являются
логическими блоками, которые могут содержать любое число вложенных в них подблоков.
Обычно каждый логический блок соответствует некоторой задаче или подзадаче, которую
он решает. Таким образом, PL/SQL поддерживает подход к решению задач по принципу
«разделяй и властвуй», известный как “пошаговое уточнение”.
Блок (или подблок) позволяет вам группировать логически связанные объявления и
предложения. Благодаря этому вы можете размещать объявления близко к тем местам, где
они используются. Объявления локальны в блоке, и перестают существовать, когда блок
завершается.
Блок PL/SQL имеет три части: декларативную часть, исполняемую часть и часть обработки
исключений (“исключением” в PL/SQL называется условие, вызывающее предупреждение
или ошибку). Исполняемая часть обязательна; две остальные части блока могут
отсутствовать.
Порядок частей блока логичен. Блок начинается с декларативной части, в которой
объявляются объекты. С объявленными объектами осуществляются манипуляции в
исполнительной части. Исключения, возбуждаемые во время исполнения, могут быть
обработаны в части обработки исключений.
Каждый блок может содержать другие блоки; иными словами, блоки могут быть вложены
друг в друга. Вложенный блок называется подблоком; он вложен в окружающий блок. Вы
можете вкладывать блоки в исполнительной части или части обработки исключений блока
PL/SQL, но не в декларативной части. Кроме того, вы можете определять локальные
подпрограммы в декларативной части любого блока. Однако вызывать локальные
подпрограммы можно только из того блока, в котором они определены.
ул. Ярославская, д. 10, корп. 4
21
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Ниже, представлен пример простейшего блока и подблоков языка PL/SQL.
declare --декларативная часть блока, для объявления переменных
serr varchar2(2000); --переменная, с именем (идентификатором) SERR, для хранения кодов ошибок блока
n number; --переменная, типа число с плавающей точкой
begin --заголовок тела блока
--тело блока
n:=0;
declare --декларативная часть подблока (блока второго уровня)
k number; --переменная подблока
begin --начало тела поблока
--тело поблока
k:=5;
end; --окончание тела поблока
exception --блок обработки ошибок
when no_data_found then --если в блоке произошла ошибка «Нет данных»
dbms_output.put_line('Данных не найдено'); --вывести ошибку
when others then --любая ошибка (кроме описанных в вышестоящих WHEN...)
serr:=sqlerrm; --считаем код ошибки в переменную, SQLERRM - функция PL/SQL, возвращает код и текст
--последней произошедшей ошиби
dbms_output.put_line('Проищошла ошибка: '||serr); --вывести ошибку
end; --окончание блока
Неименованные блоки и хранимые объекты
Неименованный блок – это код, на языке PL/SQL, который не сохранен и не откомпилирован
в виде объекта БД. Т.е. с точки зрения СУБД Oracle, этот код не имеет имени. После
исполнения неименованного блока его код не сохраняется СУБД Oracle.
Чаще всего неименованные блоки применяются для программирования разовых задач, не
предполагающих написания серьезного объема кода на языке PL/SQL. В остальных случаях
правильнее использовать хранимые объекты БД – процедуры, функции, пакеты, триггеры.
Перевести код из разряда неименованных блоков, в разряд хранимых объектов несложно,
достаточно начать блок с ключевых слов CREATE <ТИП_ОБЪЕКТА> <ИМЯ_ОБЪЕКТА> и
модифицировать код согласно синтаксису создаваемого объекта.
Хранимые объекты СУБД Oracle сохраняются в БД с определенным (уникальным внутри
схемы) именем и исходным кодом. Хранимый объект, реализованный на языке PL/SQL,
может быть “Валидным” (VALID) – т.е. корректным с точки зрения синтаксиса и готовым к
исполнению, или ”Невалидным” (INVALID) – т.е. содержать ошибки.
Хранимые процедуры
Хранимая процедура, это поименованный код PL/SQL, хранящийся в виде объекта типа
«Процедура” (PROCEDURE) в базе данных. Хранимая процедура может иметь параметры
(как входные, так и выходные).
Пример хранимой процедуры Oracle:
--хранимая процедура UDO_P_CLNTORDBUF_FILL
create procedure udo_p_clntordbuf_fill
(
--список параметров хранимой процедуры
ncompany number,
nprn number,
ddateb date,
ddatee date,
splace varchar2,
nres out number --выходной параметр
)
--деларативная часть процедуры
ул. Ярославская, д. 10, корп. 4
22
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
as
nplace number;
su varchar2(40):=user;
st varchar2(40):=userenv('TERMINAL');
--тело процедуры
begin
--проверим переданные параметры
if((ncompany is null)or(nprn is null)or(ddateb is null)or(ddatee is null)or(splace is null))then
p_exception(0, 'Параметры указаны неверно!');
end if;
-if(ddatee<ddateb)then
p_exception(0, 'Дата окончания периода должна быть больше даты начала!');
end if;
--чистим буфер
delete from udo_t_clntordbuf t where t.usr=su and t.term=st;
--находим рег. номер места назначения
find_dicpoint_by_code(nflagsmart => 0, ncompany => ncompany, spoint_code => splace, nrn => nplace);
--идем по датам от начала периода до конца
for i in 0..(ddatee-ddateb) loop
insert into udo_t_clntordbuf (rn,
prn, usr, term, place, servdate)
values (gen_id, nprn, su, st,
nplace, ddateb+i);
end loop;
end; --окончание процедуры
Хранимые функции
Хранимая функция, это поименованный код PL/SQL, хранящийся в виде объекта типа
”Функция” (FUNCTION) в базе данных. Хранимая функция может иметь параметры (как
входные, так и выходные), а так же обязана возвращать значение (для этого используется
ключевое слово RETURN).
Пример хранимой функции Oracle:
--хранимая функция UDO_F_CLNTORD_GETNEXT
create or replace function udo_f_clntord_getnext
(
--список параметров хранимой функции
ncompany number
)
return varchar2 --возвращаемое значение
as
sres varchar2(10);
begin
--расчет значения функции
select to_number(max(t.ordnom))+1 into sres from udo_t_clntord t where t.company=ncompany;
--возврат значения функции
return sres;
end; --окончание функции
Пакеты
Пакет, это поименованный набор переменных, констант, пользовательских типов, а так же
процедур и функций на языке PL/SQL, хранящийся в виде объектов типа ”Пакет”
(PACKAGE) и ”Тело пакета” (PACKAGE BODY) в базе данных. В “заголовке” пакета
прописывается его интерфейс (набор процедур, функций, констант, переменных и т.д.) к
которым можно обратиться извне пакета. В “теле” пакета описываются алгоритмы,
реализующие интерфейс пакета. Пакет может не иметь тела, но обязан иметь заголовок.
Заголовок и тело пакета с точки зрения СУБД – два разных объекта, но они должны иметь
одинаковое имя.
Пример пакета Oracle:
--заголовок пакета
create or replace package udo_pkg_sample as
ул. Ярославская, д. 10, корп. 4
23
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
--описание интерфейса пакета
--функция расчета степени числа
function calc_power (n1 number, n2 number) return number;
--процедура рассчета суммы двух чисел
procedure calc_summ (n1 number, n2 number, summa out number);
end; --окончание заголовка пакета
--тело пакета
create or replace package body udo_pkg_sample as
--реализация интерфейса пакета
--функция расчета степени числа
function calc_power (n1 number, n2 number) return number
is
begin
return n1**n2;
end;
--процедура рассчета суммы двух чисел
procedure calc_summ (n1 number, n2 number, summa out number)
is
begin
summa:=n1+n2;
end;
end; --окончание тела пакета
Триггеры
Триггер, это поименованный код PL/SQL, хранящийся в виде объекта типа ”Триггер”
(TRIGGER) в базе данных. Триггер – это особый вид объектов. Код триггера нельзя вызвать
программно. Код триггера исполняется СУБД Oracle автоматически, при наступлении в БД
события, указанного в заголовке триггера. Т.е. триггер – это механизм, с помощью которого
можно автоматически реагировать на события БД (например, контролировать корректность
данных таблиц БД, запрещать вход в систему нежелательных пользователей и т.д.).
Различают триггеры уровня системы (срабатывают при служебных событиях в БД), уровня
таблицы (срабатывают при изменении данных таблицы), уровня записи (срабатывают при
изменении одной записи таблицы). Подробнее о триггерах и событиях, обрабатываемых
ими, можно узнать в документации по СУБД Oracle.
Пример триггера Oracle:
--триггер уровня записи UDO_TR_CLNORD3_BINSERT
create or replace trigger udo_tr_clnord3_binsert
--описание события триггера
before insert --срабатывть до добавления
on udo_t_clnord3 --в таблицу UDO_T_CLNORD3
for each row --при добавлении каждой записи
begin --начало тела триггера
--регистрация добавления записи таблицы UDO_T_CLNORD3 в журнале событий системы
if(pkg_iud.prologue('UDO_T_CLNORD3','I'))then
pkg_iud.reg_rn('RN',:new.rn);
pkg_iud.reg_crn('CRN',:new.crn);
pkg_iud.reg_company('COMPANY',:new.company);
pkg_iud.reg(1,'ORD',:new.ord);
pkg_iud.reg(2,'CRDATE',:new.crdate);
pkg_iud.reg(3,'AGN',:new.agn,'AGNLIST','AGNABBR');
pkg_iud.reg(4,'SUMM',:new.summ);
pkg_iud.reg(5,'LIM',:new.lim);
pkg_iud.epilogue;
end if;
end; --окончание тела триггера
ул. Ярославская, д. 10, корп. 4
24
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Занятие 3. Пользовательские процедуры ПП «ПАРУС»
Назначение пользовательских процедур
Пользовательская
процедура
является
средством
для
выполнения
действий
(последовательности действий) с информацией базы данных системы и может быть создана
самим пользователем системы. Пользовательская процедура является, по существу,
пользовательским
действием.
Алгоритм
пользовательских
процедур
реализуется
с
применением языка Oracle PL/SQL.
Каждая пользовательская процедура связывается с определенной хранимой процедурой или
имеет в своем составе текст неименованного блока.
Таким образом, пользовательская процедура относится к одному из двух типов
(«Процедура» или «Неименованный блок»), которые имеют следующие особенности:
Процедура. Коды вносятся непосредственно в серверную часть средствами Oracle
и хранятся там под уникальным именем. Алгоритм подобной пользовательской
процедуры может запускаться на исполнение из клиентской части системы, но не
может в ней редактироваться.
Неименованный блок. Коды создаются/редактируются в клиентской части
системы и могут содержать обращение к хранимой процедуре Oracle.
При запуске на исполнение пользовательской процедуры фактически исполняется
соответствующая
хранимая
процедура
или
интерпретируется
(исполняется)
соответствующий неименованный блок.
Настройка пользовательской процедуры типа «Процедура» включает:
связывание пользовательской процедуры с определенной хранимой процедурой, уже
введенной на сервере при помощи средств Oracle;
настройку способов задания (например, вручную или выбором значения из словаря)
конкретных значений параметров хранимой процедуры;
связывание пользовательской процедуры с одним или несколькими разделами
системы – при необходимости запуска процедуры из этих разделов;
после выполнения предыдущего пункта: связывание пользовательской процедуры с
действием
или
несколькими
действиями,
допустимыми
в
разделе,
–
при
необходимости запуска процедуры одновременно с этими действиями.
Настройка пользовательской процедуры типа «Неименованный блок» включает:
непосредственный ввод текста неименованного блока;
ул. Ярославская, д. 10, корп. 4
25
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
регистрацию параметров процедуры и настройку способов задания (например,
вручную или выбором значения из словаря) конкретных значений параметров
неименованного блока;
связывание пользовательской процедуры с одним или несколькими разделами
системы – при необходимости запуска из этих разделов;
после выполнения предыдущего пункта: связывание пользовательской процедуры с
действием
или
несколькими
действиями,
допустимыми
в
разделе,
–
при
необходимости запуска процедуры одновременно с этими действиями.
Все операции по настройке (подготовке к исполнению) пользовательских процедур
производятся в разделе «Пользовательские процедуры» любого модуля Системы.
Классификация пользовательских процедур
Классификация пользовательских процедур представлена в таблице ниже.
Тип
Процедура
Способ запуска
Ручной
Способ реализации
Хранимая
процедура
реализованная на языке PL/SQL
Неименованный
блок
Неименованный
блок
Ручной
Неименованный
блок
PL/SQL,
создаваемый и хранимый средствами ПП
”ПАРУС”
Автоматический
Oracle,
Назначение
Расширение
функционала
системы
дополнительными
действиями,
исполняемыми
по
инициативе
пользователя (вручную)
Расширение
функционала
системы
действиями,
выполняющимися
автоматически
при
наступлении
определенного события
в системе (выполнении
штатного действия)
Примечание
Хранимая процедура, на
базе которой создана
пользовательская
процедура ПП “ПАРУС”
должна иметь PUBLIC
SYNONYM
и
разрешение на запуск от
имени
пользователя
PUBLIC
Из
неименованного
блока
возможно
обращение к хранимым
процедурам
Oracle.
Автоматический
неименованный блок не
должен
иметь
визуализируемых
параметров
Настройка и подключение пользовательских процедур
Работу с пользовательскими процедурами системы можно осуществлять из любого
приложения системы, из раздела ”Пользовательские процедуры”. Раздел доступен в
основном меню, путь ”Функции” > “Пользовательские процедуры”, на рисунке 3.1.
представлен внешний вид раздела ”Пользовательские приложения”.
ул. Ярославская, д. 10, корп. 4
26
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.1.
Окно раздела разбито на три части. Слева – список каталогов раздела. С его помощью можно
систематизировать подключенные пользовательские процедуры, а так же разграничить
пользователям доступ к ним (подробнее об этом можно узнать в документации по
приложению “Администратор”). Верхняя правая часть – отражает список заголовков
пользовательских процедур, относящихся к выбранному в левой части окна каталогу.
Нижняя правая часть раздела – список параметров выделенной пользовательской
процедуры. Все действия, которые требуется выполнять для регистрации и обслуживания
пользовательских процедур, доступны из контекстного меню основной части раздела
(верхней правой). Для вызова контекстного меню следует щелкнуть в указанной части
раздела правой кнопкой мыши. На рисунке 3.2. представлен внешний вид контекстного
меню раздела ”Пользовательские процедуры”.
ул. Ярославская, д. 10, корп. 4
27
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.2.
Помимо стандартных действий, характерных для любого типового раздела системы
(добавить, размножить, исправить, удалить, отобрать и т.д.) для пользовательской
процедуры доступны действия:
Перечитать список параметров – доступно для пользовательских процедур типа
”Процедура”, реализуемых на основе хранимых процедур Oracle. Действие
обеспечивает актуализацию списка параметров хранимой процедуры, отражаемого в
нижней части раздела. Источником списка параметров пользовательской процедуры,
типа ”Процедура” является список параметров хранимой процедуры Oracle.
Выполнить – позволяет исполнить пользовательскую процедуру непосредственно из
раздела ”Пользовательские процедуры”. Если исполняемая таким образом процедура
имеет параметры, привязанные к контексту целевого раздела (об этом ниже), то она
не может быть корректно исполнена из раздела ”Пользовательские процедуры”.
Формы – отображает список пользовательских форм ввода параметров процедуры,
позволяет их создавать и редактировать. По умолчанию, если у пользовательской
процедуры есть визуализируемые (задаваемые пользователем явно) входные
параметры, то система автоматически генерирует диалоговое окно для указания их
значений (форму ввода параметров). Данный пункт контекстного меню позволяет
создавать и настраивать формы самостоятельно, и назначать их определенным
пользователям или ролям системы.
ул. Ярославская, д. 10, корп. 4
28
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Связи с разделами – позволяет привязывать пользовательскую процедуру к целевым
разделам. Если процедура имеет тип исполнения ”Автоматический”, то этот пункт
контекстного меню поможет привязать такую пользовательскую процедуру к одному
из штатных действий системы.
Настройка (подключение) новой пользовательской процедуры системы – комплексное
действие, требующее проведение ряда операций в разделе ”Пользовательские процедуры”.
Подключение пользовательской процедуры (предполагается, что код процедуры на языке
PL/SQL уже реализован на момент подключения), как уже было сказано выше, можно
разбить на несколько простых шагов:
Регистрация заголовка пользовательской процедуры
Настройка параметров пользовательской процедуры
Привязка пользовательской процедуры к разделу
Теперь подробнее о каждом из этих шагов.
Добавление новой пользовательской процедуры (регистрация) осуществляется выбором
пункта контекстного меню ”Добавить”, списка процедур (пункт контекстного меню
”Размножить” позволяет зарегистрировать новую пользовательскую процедуру на основе
уже существующей). Форма добавления представлена на рисунке 3.3.
Рисунок 3.3.
Регистрация заголовка пользовательской процедуры предполагает указание следующих
параметров:
Мнемокод – краткое уникальное наименование пользовательской процедуры.
Наименование – полное наименование пользовательской процедуры, отражающее еѐ
назначение.
ул. Ярославская, д. 10, корп. 4
29
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Тип – указывает на способ реализации пользовательской процедуры. Возможные
значения ”Пользовательская процедура” или ”Неименованный блок”. При указании
типа ”Пользовательская процедура” – обязательно заполнение поля ”Процедура”, в
котором указывается имя хранимой процедуры Oracle на языке PL/SQL, реализующей
алгоритм
регистрируемой
пользовательской
процедуры.
При
указании
типа
”Неименованный блок” на форме добавления новой пользовательской процедуры
становится активной кнопка ”Редактор” (вызывает редактор кода PL/SQL) и
появляется вкладка “Неименованный блок”, где необходимо ввести код на языке
PL/SQL, реализующий алгоритм регистрируемой пользовательской процедуры.
Способ исполнения – указывает на режим работы пользовательской процедуры.
Возможные варианты – “Ручной” и “Автоматический” (доступен только для типа
пользовательской
процедуры
”Неименованный
блок”,
автоматические
пользовательские процедуры не могу иметь явных входных параметров). Ручной
способ исполнения предполагает явный вызов процедуры пользователем системы,
путем выбора соответствующего пункта меню в том разделе, к которому
пользовательская процедура будет подключена. Автоматический способ исполнения
позволяет процедуре выполняться автоматически, при исполнении пользователем
того или иного штатного действия системы.
После регистрации заголовка процедуры, система, если зарегистрирована пользовательская
процедура на базе хранимой процедуры Oracle, считает список еѐ параметров из базы
данных и отобразит их в списке ”Параметры процедуры”. Если регистрируется
пользовательская процедура типа ”Неименованный блок”, то добавление параметров
необходимо осуществлять вручную, функцией ”Добавить” (для неименованного блока со
способом исполнения ”Автоматический” задание явных параметров недопустимо).
Каждый из параметров пользовательской процедуры можно дополнительно настроить. Для
этого необходимо вызвать форму исправления параметра (двойной щелчок левой кнопкой
мыши на параметре в списке ”Параметры процедуры”, или пункт контекстного меню
”Исправить”, данного списка). Форма исправления параметра представлена на рисунке 3.4.
ул. Ярославская, д. 10, корп. 4
30
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.4.
На
вкладке
свойства
можно
задавать
следующие
характеристики
параметра
пользовательской процедуры:
Наименование – наименование параметра хранимой процедуры Oracle или
неименованного блока PL/SQL. Если параметр принадлежит пользовательской
процедуре, типа ”Процедура”, то указание наименования параметра невозможно.
Описание – текст, отражающий назначение параметра. Если это визуализируемый
входной параметр – то этот текст будет приглашением для ввода на форме ввода
параметров, если это выходной визуализируемый параметр – то этот текст будет
заголовком диалогового окна, отображающего значение выходного параметра
процедуры, после завершения еѐ исполнения системой.
Тип – указывает тип параметра. Возможные варианты – “Входной” или “Выходной”.
Задавать тип параметра можно только для параметров неименованных блоков, для
параметров пользовательских процедур, основанных на хранимых процедурах Oracle,
тип задается разработчиком процедуры, в момент определения еѐ списка параметров
модификаторами IN или OUT.
Тип данных – отражает тип данных параметра (строка, число, дата и т.д.). Указание
данной характеристики возможно только для параметров неименованных блоков, тип
параметров хранимых процедур считывается из БД Oracle автоматически.
Визуализировать после выполнения – признак, указывающий на то, что после работы
пользовательской
процедуры,
система
должна
отобразить
диалоговое
окно,
отражающее значение параметра. Указание данного признака возможно только для
выходных параметров.
ул. Ярославская, д. 10, корп. 4
31
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Обязательный для заполнения – данная характеристика обязывает пользователя
указывать значение параметра перед исполнением пользовательской процедуры. Ввод
обязательных параметров процедуры контролируется системой и на форме ввода
параметров пользовательской процедуры такие параметры помечаются специальным
цветом, а кнопка ”ОК” (обеспечивает исполнение процедуры с указанным набором
параметров), на форме ввода параметров процедуры, становится недоступной, пока
не заполнены значения всех обязательных параметров. Указание данного признака
доступно только для входных параметров.
Помимо указания общих свойств параметров, на вкладке ”Привязка”, окна добавления или
исправления параметра (рисунок 3.5.) можно указать способ задания значения для
параметра.
Рисунок 3.5.
Возможны следующие значения типа привязки:
Нет – перед запуском процедуры значение такого параметра вводится вручную.
Например, для параметра типа “NUMBER” (число) – непосредственно число.
Раздел – позволяет указать существующий раздел системы в качестве источника
значений для входного параметра. После указания раздела системы, к которому будет
привязан параметр, на форме ввода параметров процедуры для данного параметра
будет сформирован интерфейсный элемент “ ”, позволяющий открыть связанный
словарь и выбрать из него необходимое значение для параметра. В случае указания
этого способа привязки в форме редактирования доступны для заполнения поля:
o Раздел - раздел, данные которого выведутся в окне выбора при задании
значения редактируемого параметра.
ул. Ярославская, д. 10, корп. 4
32
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
o Метод вызова - метод вызова окна выбора, то есть тот или иной элемент такого
окна: например, дерево каталогов, главная таблица раздела, подчиненная
таблица раздела.
o Параметр - параметр метода вызова (регистрационный номер записи или
каталога), значение которого будет передаваться в качестве значения
редактируемого параметра. Обратите внимание: список параметров зависит от
того, каков тип данных редактируемого параметра ПП.
 Число, тогда параметр метода вызова – это регистрационный номер
записи (если в качестве метода вызова задана таблица) или каталога
(если в качестве метода вызова заданы каталоги раздела).
 Строка, тогда параметр метода вызова – это мнемокоды или
наименования записей выбранного раздела.
Если выбранный в окне «Разделы Системы» параметр относится к подчиненной
таблице раздела, то Система предложит выбрать для него “Родительский параметр”.
Это необходимо, поскольку параметры подчиненной таблицы раздела не могут
рассматриваться самостоятельно (без связи с параметрами его главной таблицы).
Родительским может быть только параметр, уже указанный в списке параметров
данной процедуры и способный быть родительским для исходного по структуре
связей базы данных Системы. Например, пусть в пользовательской процедуре есть
параметр ACC1, который нужно привязать к номеру аналитического счета. Номер
аналитического счета не имеет смысла без указания номера счета. Если задать раздел
«План счетов», метод вызова «План счетов (аналитические счета)» и параметр
«Регистрационный номер записи аналитического счета», то Система предложит
выбрать родительский параметр в поле «Родительский параметр». При нажатии
кнопки «с тремя точками» в этом поле, появится окно выбора, содержащее список
параметров текущей пользовательской процедуры: выберите тот, который будет
использован в качестве родительского. Так, если в списке параметров процедуры есть
параметр ACC, связанный с номером счета в этом же разделе, то именно он может
стать родительским для параметра ACC1. Если же в процедуре нет подобного
параметра (связанного с номером счета), то, не создав его, нельзя корректно задать
привязку ACC1 к номеру аналитического счета.
Дополнительный словарь – позволяет указать существующий дополнительный
словарь системы в качестве источника значений для входного параметра. После
указания дополнительного словаря системы, к которому будет привязан параметр, на
форме ввода параметров процедуры для данного параметра будет сформирован
ул. Ярославская, д. 10, корп. 4
33
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
интерфейсный элемент “
”, позволяющий открыть связанный словарь и выбрать из
него необходимое значение для параметра.
Организация (только для пользовательской процедуры типа «Процедура») – в
качестве значения параметра автоматически используется указание на организацию,
заданную при запуске сеанса работы с модулем системы (организации, с данными
которой работает система при выполнении процедуры). Привязка возможна только к
параметру типа ”NUMBER” (число). Параметр передается неявно (пользователь не
видит его на форме ввода данных, значение параметра система подставляет
автоматически, в зависимости от контекста).
Идентификатор ведомости (только для пользовательской процедуры типа
«Процедура») – в качестве значения параметра автоматически используется указание
на вновь созданную ведомость, для которой выполняется процедура. Привязка
возможна только к параметру типа ”NUMBER” (число). Параметр передается неявно
(пользователь не видит его на форме ввода данных, значение параметра система
подставляет автоматически, в зависимости от контекста).
Регистрационный
номер
(только
для
пользовательской
процедуры
типа
«Процедура») – в качестве значения параметра автоматически используется
регистрационный номер записи (или номера записей), выбранных перед выполнением
процедуры. Если выбрано несколько записей, процедура будет выполняться
последовательно для каждой из них: для первой выбранной записи, потом для второй
и так далее. Привязка возможна только к параметру типа ”NUMBER” (число).
Параметр передается неявно (пользователь не видит его на форме ввода данных,
значение параметра система подставляет автоматически, в зависимости от контекста).
Идентификатор отмеченных записей (только для пользовательской процедуры
типа «Процедура»). При выполнении процедуры, имеющей параметр с таким типом
привязки, отмеченные записи (или текущая, если ничего не отмечено) попадают в
таблицу SELECTLIST, а идентификатор этих записей передается в сам параметр. При
этом процедура вызывается один раз. Привязка возможна только к параметру типа
”NUMBER” (число). Параметр передается неявно (пользователь не видит его на
форме ввода данных, значение параметра система подставляет автоматически, в
зависимости от контекста).
Код раздела (только для пользовательской процедуры типа «Неименованный
блок») – в качестве значения параметра будет автоматически использоваться код
раздела, в котором в данный момент выполняется процедура. Привязка возможна
только к параметру типа ”VARCHAR” (строка). Параметр передается неявно
ул. Ярославская, д. 10, корп. 4
34
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
(пользователь не видит его на форме ввода данных, значение параметра система
подставляет автоматически, в зависимости от контекста).
На вкладке ”Значение по умолчанию”, окна настройки параметра пользовательской
процедуры (рисунок 3.6.) можно указать значение параметра, которое будет ему присвоено
автоматически при отображении окна ввода параметров процедуры.
Рисунок 3.6.
Значение по умолчанию отобразится на форме ввода параметров процедуры. При
необходимости,
в момент
ввода
параметров,
пользователь
сможет
это
значение
переопределить.
После того, как настроен заголовок пользовательской процедуры и все еѐ параметры, можно
осуществить привязку процедуры к разделам системы (если привязка не требуется, то
процедуру можно исполнить непосредственно из раздела ”Пользовательские процедуры”,
выбрав пункт контекстного меню ”Выполнить”, списка процедур). Каждая пользовательская
процедура может быть привязана к нескольким разделам системы, а автоматический
неименованный блок – к нескольким действиям системы в различных разделах. Привязка
пользовательской процедуры с типом запуска ”Ручной”, отличается от привязки
пользовательской процедуры с типом запуска ”Автоматический”. Рассмотрим привязки
таких процедур к разделам отдельно друг от друга.
Привязка пользовательской процедуры с типом запуска ”Ручной” к разделу. Для
осуществления привязки следует выбрать пункт “Связи с разделами” контекстного меню
списка ”Пользовательские процедуры”. Появившееся диалоговое окно (рисунок 3.7.)
позволяет настраивать привязки.
ул. Ярославская, д. 10, корп. 4
35
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.7.
Для добавления новой связи с разделом следует вызвать форму добавления связи (пунктом
контекстного меню или горячей клавишей). В появившемся окне добавления связи с
разделом (рисунок 3.8.), можно задавать следующие параметры связи:
Вкладка ”Связь с разделом”
o Раздел системы – из списка разделов системы выбирается тот, к которому
следует привязать пользовательскую процедуру, именно из этого раздела
пользователь сможет вызывать процедуру.
o Наименование – наименование процедуры в связанном разделе. Этот текст
будет виден пользователю в качестве имени подключаемого дополнительного
действия штатного раздела.
Вкладка ”Свойства связи”
o Завершение транзакции – влияет на то, как система обрабатывает транзакции
БД при исполнении процедуры в ручном режиме по нескольким выделенным
записям раздела:
 Если флажок установлен, то транзакции (запись результатов
выполнения
процедуры
в
базу
данных
системы)
будут
завершаться после выполнения процедуры по каждой из
выделенных
записей.
Если
при
выполнении
процедуры
возникнут сбои и для какой-либо из выделенных записей
процедура не будет выполнена, то транзакции будут завершены
по всем результатам успешного выполнения, т.е. для всех тех
записей, по которым процедура успешно выполнена.
 Если флажок не установлен, то транзакция будет завершена
однократно - после выполнения процедуры по всем выделенным
ул. Ярославская, д. 10, корп. 4
36
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
записям. Если при выполнении возникнут сбои в работе и для
какой-либо из
выделенных записей
процедура
не будет
выполнена, то транзакции не будут завершены даже для тех
записей, по которым было успешное выполнение.
o Подтверждение выполнения - если этот флажок установлен, то прежде чем
приступить к выполнению пользовательской процедуры в ручном режиме,
система выведет окно дополнительного запроса, текст запроса может быть указан
в параметре связи ”Текст подтверждения”.
o Текст подтверждения (выполнения) – этот текст появляется в окне подтверждения
запуска пользовательской процедуры. Если этот текст не задан, то запрос имеет
стандартный вид: “Выполнить пользовательскую процедуру?”. Текст может быть
задан только если установлен признак ”Подтверждение выполнения”.
o Обновление после выполнения – данный параметр связи указывает на поведение
системы после
исполнения пользовательской
процедуры и
обеспечивает
возможность перечитывания данных, отображаемых в окне раздела в момент
запуска пользовательской процедуры, из БД. Возможные варианты значений –
”Нет”, ”Текущую запись”, ”Все записи”.
Рисунок 3.8.
При
связывании
с
разделом
пользовательской
процедуры
с
типом
запуска
”Автоматический”, окно привязки выглядит так, как показано на рисунке 3.9.
ул. Ярославская, д. 10, корп. 4
37
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.9.
Как видно, окно списка связей пользовательской процедуры разбито на две части. В верхней
части отображается список разделов, к которым привязана процедура. В нижней – список
действий выделенного раздела, при исполнении которых пользователем, процедура будет
автоматически
вызываться
системой.
Итак,
для
привязки
”Автоматической”
пользовательской процедуры к действию раздела следует добавить новую привязку к
разделу, выбрав пункт контекстного меню ”Добавить” в верхней части раздела ”Связи”. В
появившемся диалоговом окне добавления (рисунок 3.10.) следует указать раздел системы, к
которому привязывается процедура (выбирается из справочника разделов системы), а так же
наименование привязки.
Рисунок 3.10.
Затем, следует выделить добавленную связь с разделом, вызвать контекстное меню
подраздела ”Действия в разделе” и выбрать там пункт ”Добавить”. Появившееся диалоговое
окно
(рисунок
3.11.)
служит
для
настройки
момента
автоматического
вызова
пользовательской процедуры.
ул. Ярославская, д. 10, корп. 4
38
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.11.
В данной форме следует указать следующие параметры:
Наименование действия – выбирается из списка действий связанного раздела (набор
действий индивидуален для каждого из разделов, с которым связана процедура),
указывает на то, при выполнении какого действия в связанном разделе будет
автоматически исполнена пользовательская процедура.
Выполнять процедуру перед действием – если признак установлен, то код
пользовательской процедуры будет исполнен до кода штатной процедуры,
реализующей действие.
Выполнять процедуру после действия – если признак установлен, то код
пользовательской процедуры будет исполнен после кода штатной процедуры,
реализующей действие.
Если не установлены оба признака ”Выполнять процедуру перед действием” и “Выполнять
процедуру после действия”, то процедура не исполняется вообще, если оба признака
установлены – то процедура исполняется два раза (“до” и “после” штатного кода).
Так же следует заметить, что исполнение кода автоматической пользовательской процедуры
осуществляется в рамках одной транзакции с исполнением кода штанной процедуры (если
не запрограммировано обратное). Таким образом, изменения, вносимые в систему штатной
процедурой реализации действия раздела, доступны внутри пользовательской процедуры,
исполняющейся ”после” штатного кода, и если пользовательская процедура вызывает откат
транзакции, то происходит откат и тех изменений, которые были внесены штатной
процедурой.
Ранее
было
сказано,
что
пользовательская
процедура
со
способом
исполнения
”Автоматический”, не может иметь явно заданных входных параметров. Это компенсируется
возможностью использования в коде такой пользовательской процедуры неявных
параметров (их значения не задаются пользователем), указывающих на некоторые
переменные окружения системы и на контекст, в котором вызывается автоматическая
процедура. Доступны следующие параметры:
ул. Ярославская, д. 10, корп. 4
39
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
COMPNAME - наименование организации
COMPANY - регистрационный номер организации
VERSION - регистрационный номер версии
CATALOG - регистрационный номер каталога
UNIT - код раздела
ACTION - код действия
FUNCTION - код действия (аналогично ACTION)
TABLE - имя таблицы раздела
DOCUMENT - регистрационный номер записи раздела
MODE - код режима (BEFORE - до действия, AFTER - после действия)
PROCEDURE - мнемокод пользовательской процедуры
JURPERS - регистрационный номер юридического лица
HIERARCHY - регистрационный номер иерархии
Для использования таких параметров в коде неименованного блока, ”автоматической”
пользовательской процедуры следует указать имя параметра в треугольных ”<>” скобках,
например, так:
declare
--в переменную С записывается значение рег. номера текущей организации
c number(17):=<COMPANY>;
--в переменную D записывается значение рег. номер текущего документа
d number(17):=<DOCUMENT>;
begin
--используем параметры в коде
if(c=123)then
...
end if;
end;
Необходимо заметить, что возможность использования конкретного параметра может
зависеть от способа применения пользовательской процедуры (некоторые из перечисленных
параметров доступны и в пользовательских процедурах типа ”Неименованный блок”, со
способом исполнения ”Ручной”), например:
<COMPNAME> и <COMPANY> – доступны всегда;
<MODE> – только для пользовательской процедуры с автоматическим способом
исполнения.
Это можно проверить при помощи следующего простейшего неименованного блока,
который выводит окно-сообщение со значением системного параметра (в примере ниже –
это COMPNAME):
begin
p_exception (0,<COMPNAME>);
end;
После того, как настройка процедуры завершена, можно еѐ использовать в работе.
Пользовательские процедуры с типом исполнения ”Автоматический” в интерфейсе
ул. Ярославская, д. 10, корп. 4
40
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
связанных разделов не видны (их запуск система осуществляет самостоятельно, согласно
привязке). Пользовательские процедуры с типом исполнения ”Ручной” доступны в
контекстном меню связанного раздела – ”Расширения” > ”Пользовательские процедуры”
(рисунок 3.12.).
Рисунок 3.12.
После выбора этого пункта контекстного меню система откроет список пользовательских
процедур, привязанных к разделу (рисунок 3.13.).
Рисунок 3.13.
После выбора пользовательской процедуры в списке, пользователь должен подтвердить
выбор двойным щелчком мыши или нажатием кнопки ”ОК”. Система выдаст запрос об
ул. Ярославская, д. 10, корп. 4
41
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
исполнении пользовательской процедуры (если выдача запроса настроена в связи процедуры
с разделом), затем появится форма ввода параметров процедуры (если есть явные
параметры, значения которых должны быть заданы пользователем). После ввода параметров,
по нажатию кнопки ”ОК”, в окне ввода параметров, их значения будут переданы коду
процедуры, и начнется исполнение PL/SQL программы.
Кроме
того,
система
позволяет
настроить
вызов
пользовательских
процедур
непосредственно из контекстного меню раздела (рисунок 3.14.), без обращения к списку
пользовательских процедур через ветку контекстного меню ”Расширения”.
Рисунок 3.14.
Для осуществления такой настройки необходимо вызвать окно настроек раздела, к которому
подключена пользовательская процедура (из контекстного меню раздела, по пункту
”Настройки”). Затем, переключиться в появившемся окне на вкладку “Действия” и найти в
списке действий ”Пользовательские процедуры” (рисунок 3.15.).
ул. Ярославская, д. 10, корп. 4
42
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.15.
После этого в коне “Настройки” появится вкладка ”Пользовательские процедуры”. Следует
переключиться на эту вкладку (рисунок 3.16.).
Рисунок 3.16.
В списке подключенных к разделу пользовательских процедур выбрать ту, вызов которой
хотите настроить через пункт контекстного меню, и щелкнуть по ней дважды, левой кнопкой
мыши и нажать ”ОК”, для сохранения настроек раздела. Значение признака ”Использовать в
меню” сменится с ”Нет” на ”Да”, а контекстном меню раздела появится пункт, для вызова
данной пользовательской процедуры. Отключение вызова пользовательской процедуры из
контекстного меню раздела осуществляется аналогичным образом.
ул. Ярославская, д. 10, корп. 4
43
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Практическое задание
Разработка пользовательской процедуры “Расчет суммы банковских
документов по контрагенту”
Задача: разработать пользовательскую процедуру, рассчитывающую сумму банковских
документов, зарегистрированных текущей организацией системы и относящихся к
указанному контрагенту. Рассчитанную сумму необходимо отобразить после завершения
работы процедуры.
Решение:
1. Реализуем хранимую процедуру Oracle
Создайте на сервере БД, в схеме PARUS, хранимую процедуру следующего содержания:
create or replace procedure udo_p_bankdocs_calc_agn_summ
/*
Расчет суммы банковских документов, относящихся к определенному контрагенту
*/
(
--ПАРАМЕТРЫ ХРАНИМОЙ ПРОЦЕДУРЫ
ncompany in number, --входной параметр, рег. номер организации
sagent in varchar2, --входной парамтер, мнемокод контрагента
nsumm out number --выходной параметр, расчитанная сумма
)
--ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ХРАНИМОЙ ПРОЦЕДУРЫ
is
nagent agnlist.rn%type; --рег. номер контрагента
--ТЕЛО ХРАНИМОЙ ПРОЦЕДУРЫ
begin
--определим рег. номер контрагента по его мнемокоду
find_agent_by_mnemo(company => ncompany, mnemo => sagent, rn => nagent);
--инициализируем выходное значение
nsumm:=0;
--строим курсорный цикл по списоку банковских документов,
--относящихся к указанному контарегнту
for c in (
select b.pay_sum
from bankdocs b --основная таблица раздела «Банковские документы»
where b.company=ncompany --берем только относящиеся к указанной организации
and b.agent_from=nagent --и указанному контрагенту
)
loop
--накапливаем сумму
nsumm:=nsumm+c.pay_sum;
end loop;
end;
Так же, для созданной процедуры следует создать синоним и дать право всем пользователям
БД на еѐ запуск:
create public synonym udo_p_bankdocs_calc_agn_summ for udo_p_bankdocs_calc_agn_summ;
grant execute on udo_p_bankdocs_calc_agn_summ to public;
Следует заметить, что процедуру можно было бы реализовать оптимальнее, например,
произведя расчет суммы документов с применением агрегативной функции SUM, языка
SQL. Представленная реализация умышленно неоптимальна, для демонстрации большего
количества приемов работы с языком PL/SQL.
2. Регистрируем заголовок пользовательской процедуры
Войдите в раздел ”Пользовательские процедуры” и проведите регистрацию заголовка новой
пользовательской процедуры с параметрами, указанными в таблице ниже.
Мнемокод
Наименование
Тип
Способ исполнения
Процедура
СуммаБанкДок
Сумма банковских документов по контрагенту
Процедура
Ручной
UDO_P_BANKDOCS_CALC_AGN_SUMM
ул. Ярославская, д. 10, корп. 4
44
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
3. Настраиваем параметры пользовательской процедуры
Если
заголовок
пользовательской
процедуры
зарегистрирован
верно,
то
система
автоматически сформирует список параметров. Настройте параметры так, как указано в
таблице ниже.
Наименование
Описание
Тип
Тип данных
Обязательный
Визуализировать
Привязка
NCOMPANY
Рег. номер организации
Входной
Число
Да
Нет
Организация
SAGENT
Контрагента
Входной
Строка
Да
Нет
Раздел
NSUMM
Сумма документов
Выходной
Число
Нет
Да
Раздел
Метод вызова
Параметр
Контрагенты
Контрагенты
Мнемокод
контрагента
4. Привязываем пользовательскую процедуру к целевому разделу
Теперь можно связать полученную процедуру с разделом “Банковские документы”. Для
этого следует выделить заголовок пользовательской процедуры ”СуммаБанкДок”, вызвать
контекстное меню и выбрать в нем пункт ”Связи с разделами”. В появившемся окне
настройки связей с разделами, завести новую связь со следующими параметрами:
Раздел
Наименование
Завершение транзакции
Подтверждение выполнения
Банковские документы
Сумма банковских документов
Нет
Нет
Текст подтверждения
Обновление после выполнения
Нет
по контрагенту
После проведения этих настроек можно перейти в раздел ”Банковские документы” и вызвать
подключенную
пользовательскую
процедуру
через
список
”Расширения”
>
”Пользовательские процедуры”.
Разработка автоматического неименованного блока “Контроль ИНН
контрагента”
Задача: разработать пользовательскую процедуру, производящую автоматический контроль
наличия ИНН у добавляемых/исправляемых контрагентов типа ”Юридическое лицо”.
Решение:
1. Регистрируем заголовок пользовательской процедуры
Откройте раздел ”Пользовательские процедуры” и начните регистрацию новой процедуры с
указанными параметрами:
Мнемокод
Наименование
Тип
Способ исполнения
КонтрНаличИННЮЛ
Контроль наличия ИНН у юридического лица
Неименованный блок
Автоматический
Процедура
Неименованный блок
См. ниже
Не нажимая кнопку ”ОК” перейдите к следующему шагу настройки.
2. Разрабатываем код неименованного блока
В окне добавления пользовательской процедуры нажмите кнопку ”Редактор” и введите
следующий код, на языке PL/SQL:
--ОБЪЯВЛЕНИЕ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ НЕИМЕНОВАННОГО БЛОКА
declare
nrn agnlist.rn%type:=<DOCUMENT>; --рег. номер проверяемого контрагента
serr varchar2(2000); --буфер, для хранения кода ошибки
sinn agnlist.agnidnumb%type; --переменная для хранения ИНН контрагента
ntype agnlist.agntype%type; --переменная для хранения типа контрагента
--ТЕЛО НЕИМЕНОВАННОГО БЛОКА
begin
--считаем ИНН и тип контрагента
begin --начало подблока
select ag.agnidnumb, --ИНН
ag.agntype --тип (0 - ЮЛ, 1 - ФЛ)
ул. Ярославская, д. 10, корп. 4
45
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
into sinn, --поместить ИНН в переменную
ntype --поместить тип контрагента в переменную
from agnlist ag --таблица словаря «Контрагенты»
where ag.rn=nrn; --берем только проверяемого
exception --оработка ошибок, которые могут возникнуть при выполнении SELECT
when no_data_found then --не найдено данных
--отобразим сообщение о том, что такого контрагента нет
p_exception(0, 'Контрагент с рег. номером '||nrn||' не найден!');
when others then --неопределенная ошибка
--поместим последнюю ошибку в буферную переменную
serr:=sqlerrm;
--отобразим сообщение об ошибке
p_exception(0, 'Ошибка при считывании контрагента: '||serr);
end; --конец подблока
--анализируем считанные значения полей, проверяемого контрагента
if(ntype=0)then --если это ЮЛ
if(sinn is null)then --и его ИНН не заполнен
--отобразим сообщение об обязательности ИНН у ЮЛ
p_exception(0, 'Заполнение ИНН для юридических лиц - обязательно!');
end if;
end if;
end;
Теперь можно нажать кнопку “ОК” и завершить регистрацию заголовка пользовательской
процедуры. Т.к. данная процедура предполагает автоматический запуск, то мы не
регистрируем для неѐ параметры, а в коде использовали параметр <DOCUMENT>,
указывающий системе не то, что перед вызовом процедуры следует передать в неѐ
регистрационный номер документа, с которым работает пользователь.
3. Привязываем пользовательскую процедуру к целевому разделу
Созданную пользовательскую процедуру следует привязать к разделу. Для этого, откройте
окно настройки связей процедуры с разделами (пункт контекстного меню пользовательской
процедуры ”Связи с разделами”) и добавьте новую связь, как это показано на рисунке 3.17.
Рисунок 3.17.
Для созданной связи необходимо указать действия, в момент выполнения которых в разделе
”Контрагенты”, будет запускаться настраиваемая пользовательская процедура. Следует
добавить два действия, как это показано в таблице ниже.
Дейтсвие
Выполнять “До”
Выполнять ”После”
Добавление/размножение контрагента
Нет
Да
Исправление контрагента
Нет
Да
Теперь можно перейти в словарь ”Контрагенты” и попробовать добавить нового
контрагента, с типом ”Юридическое лицо” и без указания ИНН. Если всѐ настроено
корректно, то в результате должно появиться предупредительное сообщение (рисунок 3.18.)
и контрагент не будет добавлен в систему.
ул. Ярославская, д. 10, корп. 4
46
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 3.18.
Таким
образом,
контроль
наличия
ИНН,
реализованный
нашей
автоматической
пользовательской процедурой, работает, и пользователь не сможет завести юридическое
лицо без указания ИНН. Аналогично данный контроль будет работать в момент исправления
существующих юридических лиц, т.к. при настройке мы указали привязку к действию
”Исправить”.
Занятие 4. Пользовательские задания ПП “ПАРУС”
Назначение пользовательских заданий
Пользовательское задание (ПЗ) – это средство для выполнения определенных действий с
информацией базы данных системы в автоматическом режиме. Подобные действия
записываются на языке PL/SQL и составляют хранимую процедуру или неименованный
блок.
Все операции по настройке (подготовке к исполнению) пользовательских заданий
производятся в разделе «Пользовательские задания» любого модуля системы.
Настройка ПЗ включает:
Связывание ПЗ с определенной пользовательской процедурой.
Формирование расписания запуска ПЗ на выполнение, например, «один раз каждые
сутки».
Задание конкретных значений параметров процедуры.
Активацию ПЗ.
При помощи пользовательской процедуры задается алгоритм ПЗ. Пользовательская
процедура должна быть введена на сервере Системы средствами ORACLE. Эта процедура
регистрируется в одноименном разделе системы и может иметь один или несколько входных
параметров, управляющих работой алгоритма.
Например, формирование прайс-листа может выполняться для определенного вида товаров,
который и задается соответствующим значением параметра процедуры.
ПЗ запускается (активизируется) в разделе «Пользовательские задания» любого модуля
системы. Если пользовательское задание связано с разделами системы, то его запуск
ул. Ярославская, д. 10, корп. 4
47
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
возможен и в этих разделах. Ручной запуск (по команде), а также запуск при помощи
функции EUP, применяемой в формулах, не предусмотрен.
После выполнения команды «Активация задания» ПЗ автоматически запускается через
равные промежутки времени, заданные при помощи расписания.
При
запуске
на
исполнение
пользовательского
задания
фактически
исполняется
соответствующая хранимая процедура. Таким образом, для исполнения хранимой
процедуры надо зарегистрировать пользовательское задание, а затем активировать его. При
этом ввод конкретных значений параметров процедуры производится на этапе подготовки
(настройки) задания. Выполнение пользовательских заданий осуществляется автоматически
в соответствии с расписанием, указанным в таком задании.
Настройка и подключение пользовательских заданий
Работа ПЗ основана на объектах типа “Job”, СУБД Oracle. Поэтому, исполнение
пользовательских заданий происходит без участия клиентской части системы и может
выполняться даже если к БД не подключено ни одного пользователя.
Для того, что бы Oracle мог корректно исполнять ПЗ, в конфигурационном файле БД должен
присутствовать параметр JOB_QUEUE_PROCESSES, и его значение должно быть не меньше
10. Т.е. в файле конфигурации БД должна быть строка
job_queue_processes=30
Это
обеспечивает
работоспособность
механизма
Oracle
Job,
а
следовательно
и
пользовательских заданий.
Для справки: по сути, раздел ”Пользовательские задания” является графической оболочкой
для обслуживания объектов БД типа ”Job”. Вы можете самостоятельно создавать,
удалять и настраивать задания для СУБД Oracle, воспользовавшись системным пакетом
DBMS_JOB.
Итак, для регистрации нового пользовательского задания следует открыть раздел
”Пользовательские задания” (путь в меню ”Функции” > ”Пользовательские задания”),
любого приложения системы. На рисунке 4.1. показано окно раздела.
ул. Ярославская, д. 10, корп. 4
48
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 4.1.
Как и в случае с пользовательскими процедурами, окно раздела разбито на три части. Слева
– список каталогов раздела. С его помощью можно систематизировать настроенные
пользовательские задания, а так же разграничить пользователям доступ к ним (подробнее об
этом можно узнать в документации по приложению “Администратор”). Верхняя правая
часть – отражает список заголовков пользовательских заданий, относящихся к выбранному в
левой части окна каталогу. Нижняя правая часть раздела – список параметров выделенного
пользовательского задания (определяется списком параметров пользовательской процедуры,
на которой базируется ПЗ). Все действия, которые требуется выполнять для регистрации и
обслуживания ПЗ, доступны из контекстного меню основной части раздела (верхней
правой). Для вызова контекстного меню следует щелкнуть в указанной части раздела правой
кнопкой мыши. На рисунке 4.2. представлен внешний вид контекстного меню раздела
”Пользовательские задания”.
Рисунок 4.2.
Для регистрации нового ПЗ следует выбрать пункт контекстного меню ”Добавить”, в
открывшемся диалоговом окне (рисунок 4.3.) указать параметры нового ПЗ и нажать ”ОК”.
ул. Ярославская, д. 10, корп. 4
49
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Рисунок 4.3.
Для каждого ПЗ обязательно указывать следующие параметры:
Приложение – указывает на то, от имени какого из приложений системы будет
работать пользовательское задание. По сути, это приложение (модуль) системы к
которому принадлежат записи раздела, преобразуемые пользовательской процедурой,
связанной с ПЗ. После указания приложения ПЗ будет обладать теми же правами, что
и это приложение. Для пользователя, регистрирующего ПЗ, должны быть заданы
права доступа на выполнение действий, заданных в пользовательской процедуре ПЗ,
иначе ПЗ не выполняется.
Организация – указывает на то, для какой организации системы будет выполняться
ПЗ. Доступно для указания, если признак «Все организации» не установлен.
Все организации – признак, указывающий на необходимость выполнения ПЗ для всех
организаций
системы.
Если
признак
установлен,
то
указание
параметра
”Организация” недоступно.
Описание – произвольное описание, указывающее на выполняемые пользовательским
заданием действия.
Пользовательская процедура – ссылка на запись раздела ”Пользовательские
процедуры”, указывающая на процедуру, реализующую алгоритм ПЗ.
Количество запусков – ограничение на количество запусков ПЗ, согласно его
расписанию. Если не указано – ПЗ исполняется бесконечное число раз, согласно
расписанию, до тех пор, пока не будет деактивировано.
Дата начала – дата ввода ПЗ в работу. Может быть указана текущая или любая дата в
будущем. Начиная с указанной даты, ПЗ будет исполняться согласно расписанию.
Периодичность – указывает на периодичность выполнения ПЗ. После выбора одного
из значений этого параметра (ежемесячно, еженедельно, ежедневно, ежечасно или
ул. Ярославская, д. 10, корп. 4
50
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
ежеминутно) меняется содержимое вкладки ”Расписание” (рисунок 5.4.), диалогового
окна добавления ПЗ.
Расписание – указывает на расписание работы ПЗ, состав параметров расписания
зависит от выбранной периодичности запуска ПЗ. Настраивается на вкладке
”Расписание” (рисунок 4.4.) диалогового окна добавления ПЗ.
Рисунок 4.4.
Если у пользовательской процедуры, указанной в заголовке ПЗ есть параметры, то они
отобразятся в списке параметров ПЗ (нижняя правая часть раздела). Для нормальной работы
ПЗ следует указать значения всех обязательных параметров перед пуском ПЗ в работу
(указание параметров в момент исполнения ПЗ невозможно).
После добавления ПЗ и настройки параметров, следует его активировать. Для этого,
необходимо выделить нужное ПЗ, вызывать контекстное меню и выбрать пункт “Активация
задания”. После активации – создается объект Oracle Job, ему присваивается системный
номер и объект начинает свою работу согласно указанному расписанию. Кроме того, на
форме редактирования ПЗ появляется вкладка ”Статистика”, рисунок 4.5., позволяющая
отслеживать процесс работы ПЗ, а параметры ПЗ блокируются для исправления.
Рисунок 4.5.
ул. Ярославская, д. 10, корп. 4
51
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
На вкладке ”Статистика”, окна исправления ПЗ отслеживаются следующие параметры:
Системный номер – номер объекта Oracle Job, обеспечивающего работу ПЗ.
Последний запуск – дата и время последнего запуска ПЗ.
Количество запусков – общее количество произведенных запусков ПЗ.
Состояние – текущее состояние ПЗ (возможные значения - неактивно, активно,
недоступно). Состояние ”Недоступно”, указывает на то, что пользовательское задание
выполнено и больше запускаться не будет (например, ПЗ уже полностью исполнило
свое расписание или исчерпало лимит запусков).
Следующий запуск – дата и время следующего запуска ПЗ, согласно расписания.
Количество сбоев – количество неудачных попыток работы ПЗ.
Если необходимо провести внеплановую остановку работающего ПЗ, то следует его
выделить в списке ”Пользовательские задания” и вызвать пункт контекстного меню
“Деактивация задания”.
Если с момента регистрации ПЗ сменился набор параметров пользовательской процедуры,
на которой базируется ПЗ, то их список можно перечитать, выбрав пункт контекстного меню
”Пересоздать список параметров”.
Практическое задание
Разработка пользовательского задания “Сбор статистики”
Задача: разработать пользовательское задание, обеспечивающее автоматический регулярный
(еженедельный) сбор статистики обращения пользователей к таблицам схемы PARUS.
Решение:
1. Разрабатываем хранимую процедуру сбора статистики
Откомпилируйте в БД, в схеме PARUS, следующую хранимую процедуру:
create or replace procedure udo_p_calc_stat
/*
Хранимая процедура сбора статистики по таблицам схемы PARUS
*/
is
--переменная переменная для хранения динамической DDL команды
ssql varchar2(200);
begin
--курсорный цикл по таблицам, принадлежащим пользователю PARUS
for cur in (
select t.object_name --выбираем ися объекта
from all_objects t –сист-ое представление Oracle, содержит сведения по всем объектам БД
where t.owner='PARUS' --берем только те, которые относятся к пользователю PARUS
and t.object_type='TABLE' --и являются таблицами
)
loop
--формируем динамическую SQL команду - сбор статистики по текущей таблице
--ANALYZE TABLE <ИМЯ_ТАБЛИЦЫ> COMPUTE STATISTICS
ssql:='analyze table '||cur.object_name||' compute statistics';
--исполнение сформированной SQL команды
execute immediate ssql;
end loop;
end;
ул. Ярославская, д. 10, корп. 4
52
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
Так же, для созданной процедуры следует создать синоним и дать право всем пользователям
БД на еѐ запуск:
create public synonym udo_p_calc_stat for udo_p_calc_stat;
grant execute on udo_p_calc_stat to public;
2. Регистрируем на базе хранимой процедуры ”Пользовательскую процедуру” Парус
Откройте раздел ”Пользовательские процедуры” и добавьте новую, указав еѐ параметры так,
как показано на рисунке ниже.
Кроме указанных параметров, для такого рода пользовательских процедур, других настроек
не требуется (параметров у хранимой процедуры нет, а к разделам процедуру привязывать
не имеет смысла, т.к. она будет выполняться не пользователем, а пользовательским
заданием).
3. Регистрируем “Пользовательское задание”,
на базе созданной пользовательской
процедуры
Теперь перейдите в раздел ”Пользовательские задания” и зарегистрируйте новое задание так,
как показано на рисунке ниже.
Также, укажите расписание:
ул. Ярославская, д. 10, корп. 4
53
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
4. Активируем пользовательское задание
Теперь, задание можно активировать, выбрав пункт контекстного меню “Активировать
задание” (см. рисунок ниже).
5. Анализируем статистику работы полученного ПЗ
Если настройки сделаны верно, то задание начнет работу, а на вкладке ”Статистика”, окна
редактирования ПЗ, отобразится его текущее состояние (см. рисунок ниже).
Таким образом, статистика Oracle, позволяющая уменьшить время отклика СУБД на
популярные запросы пользователей и позволяющая оптимизатору Oracle обрабатывать
ул. Ярославская, д. 10, корп. 4
54
(495) 797-89-90/91
«ПАРУС-Предприятие 8»
Пользовательские процедуры
запросы с максимальной эффективностью, будет собираться еженедельно. Тем самым, мы
автоматизировали одну из функциональных обязанностей администратора БД.
ул. Ярославская, д. 10, корп. 4
55
(495) 797-89-90/91
Похожие документы
Скачать