...
Пример 1. Вызов процедуры создания физического лица:
Code Block |
---|
|
DECLARE
num_N_SUBJECT_ID_Created NUMBER := NULL; -- пустой идентификатор говорит о том, что требуется создать новое физлицо
BEGIN
SI_PERSONS_PKG.SI_PERSONS_PUT (
num_N_SUBJECT_ID => num_N_SUBJECT_ID_Created,
...);
-- При успешном выполнении процедуры в переменную num_N_SUBJECT_ID_Created запишется идентификатор вновь созданной записи.
-- Значение идентификатора выдается системой автоматически.
END; |
Пример 2. Редактирование существующего физического лица:
Code Block |
---|
|
DECLARE
num_N_SUBJECT_ID_Edit NUMBER := 123455601; -- необходимо указать идентификатор существующего физлица, иначе при вызове будет ошибка.
BEGIN
SI_PERSONS_PKG.SI_PERSONS_PUT (
num_N_SUBJECT_ID => num_N_SUBJECT_ID_Edit,
...);
END; |
...
Помимо встроенного механизма исключений Oracle,
использует и собственный механизм работы с сообщениями. Он применяется в случаях, когда использование встроенного механизма невозможно, в частности, при массовых обработках или при необходимости вывести информационное сообщение либо предупреждение не нарушая ход выполнения процедуры и не выполняя откат транзакции. Чтобы выводить такие сообщения, следует после выполнения хранимой процедуры сделать выборку всех записей из специальной временной таблицы:
Code Block |
---|
|
SELECT * FROM TT_V_MESSAGE_LOGS; |
Если количество извлеченных из этой таблицы сообщений больше нуля, то необходимо вывести их все пользователю и/или в лог, после чего очистить таблицу:
Code Block |
---|
|
DELETE FROM TT_MESSAGE_LOGS; |
...
Для передачи констант в качестве значения аргумента хранимой процедуры рекомендуется использовать обращение через пакет: SS_CONSTANTS_PKG_S.<код константы>
. Пример:
Code Block |
---|
|
BEGIN
-- Аннулировать документ с идентификатором 1577736201
SD_DOCUMENTS_PKG.SD_DOCUMENTS_CHANGE_STATE (
num_N_DOC_ID => 1577736201,
num_N_New_DOC_STATE_ID => SS_CONSTANTS_PKG_S. DOC_STATE_Canceled);
END; |
Для SQL-запросов к представлениям необходимо применять обращение через контекст: SYS_CONTEXT('CONST', '<код константы>')
. Пример:
Code Block |
---|
|
-- Подсчитать количество актуальных инвойсов в системе
SELECT COUNT(*)
FROM SD_V_DOCUMENTS
WHERE N_DOC_TYPE_ID = TO_NUMBER(SYS_CONTEXT('CONST', 'DOC_TYPE_Invoice'))
AND N_DOC_STATE_ID = TO_NUMBER(SYS_CONTEXT('CONST', 'DOC_STATE_Actual')); |
...
Приложения, постоянно взаимодействующие с
, в целях ускорения работы и сокращения нагрузки на БД могут загружать (кэшировать) сразу все константы при инициализации. Для этого нужно сделать следующий запрос:
Code Block |
---|
|
SELECT *
FROM SS_V_CONSTANTS; |
...
Чтобы получить, например, название типа документа в текстовом представлении по его числовому идентификатору, удобно использовать процедуры из пакета SI_REF_PKG_S
. Пример:
Code Block |
---|
|
SQL> -- Подcчитать, сколько сейчас актуальных документов в разрезе типа документа
SQL> SELECT N_DOC_TYPE_ID,
2 SI_REF_PKG_S.GET_NAME_BY_ID(N_DOC_TYPE_ID) VC_DOC_TYPE,
3 COUNT(*) N_COUNT
4 FROM SD_V_DOCUMENTS
5 WHERE N_DOC_STATE_ID = TO_NUMBER(SYS_CONTEXT('CONST', 'DOC_STATE_Actual'))
6 GROUP BY N_DOC_TYPE_ID
7 ORDER BY N_COUNT DESC;
N_DOC_TYPE_ID VC_DOC_TYPE N_COUNT
------------- --------------------------------------------------
5002 Платёжное поручение 69950
4002 Кассовый ордер 9328
1002 Договор на оказание услуг 2817
3002 Инвойс 1177
6002 Счёт 515
7002 Приказ по ценам 171
11002 Банковская выписка 74
9002 Базовый договор 25
13002 Доп. соглашение 15
20002 Заявка 6
12002 Приказ по временным интервалам 3
8002 Отказ в обслуживании 1
12 rows selected |
...
Для получения всего диапазона значений заданного справочника можно воспользоваться следующим SQL-запросом:
Code Block |
---|
|
SELECT N_REF_ID,
VC_CODE,
VC_NAME
FROM SI_V_REF
WHERE N_REF_TYPE_ID = SI_REF_PKG_S.GET_ID_BY_CODE('<vch_VC_REF_NAME>')
|
...
Для получения значения конкретной справочной записи можно воспользоваться следующим SQL-запросом:
Code Block |
---|
|
SELECT SI_REF_PKG_S.GET_ID_BY_CODE('<vch_VC_REF_CODE>')
FROM DUAL |
...
Для корректной работы в
после установления соединения с Oracle приложение должно вызвать процедуру
MAIN.INIT
. Пример:
Code Block |
---|
|
BEGIN
MAIN.INIT(
vch_VC_IP => '127.0.0.1', -- IP-адрес, с которого выполняется вход в систему
vch_VC_USER => 'Payment_RPC', -- Логин пользователя АСР «Гидра» на приложение
vch_VC_PASS => 'secret123', -- Пароль пользователя на приложение
vch_VC_APP_CODE => 'NETSERV_HID', -- Код приложения в АСР «Гидра»
vch_VC_CLN_APPID => 'my app info'); -- Информационная строка приложения (название, версия и т. д.)
END; |
...
В сторонних приложениях, в которых возможен интенсивный вызов MAIN.INIT
(чаще 1 раза в минуту), для предотвращения сильного роста таблицы с сессиями следует использовать инициализацию сессии в сочетании с MAIN.SWITCH_CONTEXT
. Пример:
Code Block |
---|
|
BEGIN MAIN.SWITCH_CONTEXT(
vch_VC_CLN_SESSIONID => 'my external id');
EXCEPTION WHEN MAIN.SESSION_DOES_NOT_EXIST OR
MAIN.SESSION_CLOSED OR
MAIN.MULTIPLE_SESSIONS THEN
MAIN.INIT(
vch_VC_IP => '127.0.0.1',
vch_VC_USER => 'rpc',
vch_VC_PASS => 'password',
vch_VC_APP_CODE => 'NETSERV_HID',
vch_VC_CLN_SESSIONID => 'my external id',
vch_VC_CLN_APPID => 'my app info');
END;
/ |
...