Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Пример 1. Вызов процедуры создания физического лица:

Code Block
sql
languagesql
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
sql
languagesql
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, 

ais_name
использует и собственный механизм работы с сообщениями. Он применяется в случаях, когда использование встроенного механизма невозможно, в частности, при массовых обработках или при необходимости вывести информационное сообщение либо предупреждение не нарушая ход выполнения процедуры и не выполняя откат транзакции. Чтобы выводить такие сообщения, следует после выполнения хранимой процедуры сделать выборку всех записей из специальной временной таблицы:

Code Block
sql
languagesql
SELECT * FROM TT_V_MESSAGE_LOGS;

Если количество извлеченных из этой таблицы сообщений больше нуля, то необходимо вывести их все пользователю и/или в лог, после чего очистить таблицу:

Code Block
sql
languagesql
DELETE FROM TT_MESSAGE_LOGS;

...

Для передачи констант в качестве значения аргумента хранимой процедуры рекомендуется использовать обращение через пакет: SS_CONSTANTS_PKG_S.<код константы>. Пример:

Code Block
sql
languagesql
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
sql
languagesql
-- Подсчитать количество актуальных инвойсов в системе
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'));

...

Приложения, постоянно взаимодействующие с

ais_name
, в целях ускорения работы и сокращения нагрузки на БД могут загружать (кэшировать) сразу все константы при инициализации. Для этого нужно сделать следующий запрос:

Code Block
sql
languagesql
SELECT *
FROM   SS_V_CONSTANTS;

...

Чтобы получить, например, название типа документа в текстовом представлении по его числовому идентификатору, удобно использовать процедуры из пакета SI_REF_PKG_S. Пример:

Code Block
sql
languagesql
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
languagesql
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
languagesql
SELECT SI_REF_PKG_S.GET_ID_BY_CODE('<vch_VC_REF_CODE>')
FROM   DUAL

...

Для корректной работы в 

ais_name
после установления соединения с Oracle приложение должно вызвать процедуру MAIN.INIT. Пример:

Code Block
sql
languagesql
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
languagesql
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;
/

...