Мне редко приходится писать на Java хранимые процедуры для СУБД Oracle. А когда приходится, всякий раз я трачу некоторое время на "восстановление контекста", чтобы вспомнить особенности встроенной JVM и работы с ней. Чтобы в следующий раз восстановление контекста прошло быстрее, в этой статье в конспективной форме я собрал самые необходимые сведения и примеры кода на Java для встроенной Oracle JVM.
В любой среде, где выполняются параллельные процессы, актуальны вопросы совместного использования общих ресурсов и обмена сообщениями между процессами. Одновременно открытые сеансы СУБД Oracle - именно такие параллельные процессы. Я уже рассматривал конкурентный доступ к общим ресурсам с помощью пакета DBMS_LOCK
, а теперь поэкспериментриую со средствами обмена сигналами и данными между сеансами СУБД Oracle 11gR2 - пакетами DBMS_ALERT
и DBMS_PIPE
.
Сеансы работы с СУБД Oracle есть параллельно выполняющиеся процессы, работающие как с собственными, так и с общими ресурсами. Объекты БД, такие как таблицы, индексы, являются общими ресурсами, и СУБД Oracle делает все возможное для того, чтобы конкурентный доступ к табличным данным был эффективным и максимально незаметным - прозрачным - для сеансов. Однако, в ряде случаев от программиста требуется явная блокировка ресурса на время работы с ним, и освобождение ресурса по окончании работы.
Если вам приходилось иметь дело с "долгоиграющими" PL/SQL процедурами, которые выполняются от десятков минут до многих часов, то перед вами вставал вопрос, сколько работы уже сделано на данный момент и сколько еще осталось. Как заглянуть внутрь выполняющейся PL/SQL процедуры?
Oracle предоставляет несколько средств, которыми можно вопользоваться для этой цели (а также для целей отладки, профилирования, и других, которые подскажет ваша фантазия) - это пакеты DBMS_APPLICATION_INFO, DBMS_ALERT и DBMS_PIPE.
В первой части статьи была сделана попытка понять, что есть NULL
, и установлены два аспекта этого явления: в зависимости от контекста, NULL
удобно интерпретировать либо как признак отсутствия значения, либо как неизвестное значение. Были рассмотрены: отсутствие значения в столбце таблицы, и как этого избежать с помощью ограничений целостности; взаимоотношения NULL
и строковых типов VARCHAR2
и CHAR
; использование NULL
в выражениях и в качестве агрумента встроенных функций Oracle, скалярных и агрегатных.
Во второй части я рассмотрю взаимоотношения NULL
и значений типа BOOLEAN
в PL/SQL; эффекты, имеющие отношение к NULL
и результатам подзапросов, а также к оператору IN
; сортировку по столбцу, часть значений в котором отсутствует.