Я узнал, что время бывает разное:
- количественное (1 час, 5 января 2014, 3 минуты)
- и качественное (утро, весна, предвоенное, счастливое).
Я узнал, что время бывает разное:
В СУБД Oracle операции над множествами можно выполнять, как минимум, в трех контекстах с помощью трех различных механизмов. Это
В этом порядке они и будут рассмотрены ниже, но сначала - суперкраткое введение в понятие множества.
В прошлый раз я исследовал на практике, как работают разрешения rwx
в Linux. Сегодня я продолжу упражнения с правами доступа к файлам и каталогам в Linux и рассмотрю атрибуты setuid
, setgid
и sticky bit
. (Забегая вперед, скажу, что приключение оказалось интереснее, чем я ожидал.) Все приводимые далее примеры я буду выполнять в консоли Ubuntu 14.04.
Я собираюсь исследовать на практике то, что в общих чертах представляю себе в теории. А именно: на простых примерах разобраться, как работают права доступа к файлам и каталогам в Linux. Все приводимые далее примеры я буду выполнять в консоли Ubuntu 14.04.
В этой статье я рассмотрю, как Java код, выполняющийся внутри СУБД Oracle, работает с данными в БД. Попутно продемонстрирую работу резолвера (resolver) встроенной Oracle JVM и экспериментально установлю, с какими правами выполняется Java код внутри СУБД - правами владельца кода (definer) или вызывающего пользователя (invoker). В заключение, я продемонстрирую использование SQLJ для включения команд SQL в исходный код JAVA.
Здесь собраны примеры, демонстрирующие некоторые из полезных возможностей Oracle SQL*Plus. Все приведенные скрипты выполнены в SQL*Plus Release 11.2.0.1.0 в консоли Windows.
Подборка носит отчасти ностальгический характер, поскольку в последние годы всю повседневную оперативную работу с СУБД Oracle я делаю в PL/SQL Developer. Однако, SQL*Plus остается незаменимым для работы в консоли Unix/Linux и из shell-скриптов. Пример в конце статьи - только для Unix/Linux.
Винсент: Знаешь, что самое забавное в Европе?
Джулс: Что?
Винсент: Такие маленькие отличия. Там вроде все то же самое, что и здесь, но чуть-чуть отличается.
"Криминальное чтиво"
Как известно, ключевым отличием Python 3.x от Python 2.x является переориентация языка и стандартных библиотек со строк байтов на строки символов Unicode. Когда я решил повнимательнее посмотреть на это различие, пришлось копнуть вглубь и вширь, а результаты моих раскопок я оформил в статью, которую предлагаю вашему вниманию.
В Python 2 | В Python 3 |
---|---|
строковый литерал получает тип str |
строковый литерал получает тип str |
тип str представляет собой строку байтов |
тип str представляет собой строку символов Unicode |
для представления строки символов Unicode используется тип unicode |
для представления строки байтов используется тип bytes |
для представления строки unicode в нужной кодировке используется метод unicode.encode(кодировка) , возвращающий строку байтов str |
для представления строки str в нужной кодировке используется метод str.encode(кодировка) , возвращающий строку байтов bytes |
для преобразования строки байтов str в строку unicode используется метод str.decode(кодировка) , возвращающий строку unicode |
для преобразования строки байтов bytes в строку str используется метод bytes.decode(кодировка) , возвращающий строку str |
системная кодировка по умолчанию, она же кодировка исходных файлов по умолчанию, ASCII | системная кодировка по умолчанию, она же кодировка исходных файлов по умолчанию, UTF-8 |
при записи в файл строки по умолчанию преобразуются в системную кодировку по умолчанию | при записи в файл строки по умолчанию преобразуются в кодировку, определяемую пользовательскими настройками |
идентификаторы в программе содержат только символы ASCII, не могут использовать никаких других букв, кроме латинских | идентификаторы в программе содержат символы Unicode, могут использовать буквы других алфавитов, кроме латинского |
Мои эксперименты я ставлю под ОС Windows 7 в стандартной консоли.
В первой части статьи я перечислил основные различия традиционной виртуальной машины Java и JVM, встроенной в СУБД Oracle. А также создал в базе данных несколько Java классов и PL/SQL обертки для вызова их методов, и продемонстрировал передачу и возврат значений из PL/SQL в Java код и обратно. Во второй части будет показан альтернативный способ создания объектов JAVA CLASS, рассмотрено поведение статических переменных класса в течение сеанса Oracle, и реализован Java класс и соответствующая PL/SQL обертка для чтения/записи внешних файлов.
Мне редко приходится писать на Java хранимые процедуры для СУБД Oracle. А когда приходится, всякий раз я трачу некоторое время на "восстановление контекста", чтобы вспомнить особенности встроенной JVM и работы с ней. Чтобы в следующий раз восстановление контекста прошло быстрее, в этой статье в конспективной форме я собрал самые необходимые сведения и примеры кода на Java для встроенной Oracle JVM.
В любой среде, где выполняются параллельные процессы, актуальны вопросы совместного использования общих ресурсов и обмена сообщениями между процессами. Одновременно открытые сеансы СУБД Oracle - именно такие параллельные процессы. Я уже рассматривал конкурентный доступ к общим ресурсам с помощью пакета DBMS_LOCK, а теперь поэкспериментирую со средствами обмена сигналами и данными между сеансами СУБД Oracle 11gR2 - пакетами DBMS_ALERT
и DBMS_PIPE
.
Сеансы работы с СУБД Oracle есть параллельно выполняющиеся процессы, работающие как с собственными, так и с общими ресурсами. Объекты БД, такие как таблицы, индексы, являются общими ресурсами. CУБД Oracle делает все возможное для того, чтобы конкурентный доступ к табличным данным был эффективным и максимально незаметным - прозрачным - для сеансов. Однако, в ряде случаев от программиста требуется явная блокировка ресурса на время работы с ним, и освобождение ресурса по окончании работы.
Таким ресурсом может быть, например, экземпляр некоторой сущности предметной области (сотрудник, элемент орг. структуры, и т.д.) Строки одной таблицы сеанс может зарезервировать для исключительного использования при помощи SELECT ... FOR UPDATE
. Но в случае, когда необходимо заблокировать данные, распределенные по нескольким таблицам, лучшим решением будет специальное соглашение между конкурирующими процессами о доступе к ресурсу. А реализовать такое соглашение поможет пакет DBMS_LOCK
.
Если вам приходилось иметь дело с "долгоиграющими" PL/SQL процедурами, которые выполняются от десятков минут до многих часов, то перед вами вставал вопрос, сколько работы уже сделано на данный момент и сколько еще осталось. Как заглянуть внутрь выполняющейся PL/SQL процедуры?
Если процедура изменяет данные в таблицах и периодически выполняет COMMIT
, то понять, сколько работы уже сделано, можно с помощью запросов к изменяемым процедурой таблицам. Но это не всегда работает. Например, если выполняется сложный анализ, по итогам которого изменения делаются не во всех случаях, то с помощью запросов к таблицам не получится узнать, какая часть данных уже проанализирована.
В этом случае нужно предусмотреть механизм, который обеспечит видимость прогресса работы процедуры из другого сеанса работы с БД. Это может быть специальная таблица, в которую PL/SQL процедура будет вставлять записи о завершении отдельных этапов работы и о прогрессе каждого этапа. Как вариант, записи могут добавляться и обновляться в рамках автономных транзакций. Тогда, делая запрос к этой таблице в отдельном сеансе, можно видеть текущий прогресс выполнения PL/SQL процедуры.
В большинстве случаев нет необходимости изобретать велосипед и реализовавать собственное решение для отслеживания прогресса "долгоиграющих" операций. СУБД Oracle предоставляет несколько средств, которыми можно вопользоваться для этой цели (а также для целей отладки, профилирования, и других, которые подскажет ваша фантазия) - это пакеты DBMS_APPLICATION_INFO
, DBMS_ALERT
и DBMS_PIPE
. Все эти средства позволяют тем или иным образом организовать передачу данных из одного сеанса работы с СУБД Oracle в другой.
Представляю вашему вниманию книгу "Мыслить как программист. Учимся с Python", 2-е издание. Это книга для тех, кто хочет научиться программировать. Книга учит программированию, используя язык Python как средство обучения.
Это открытая книга, по аналогии с открытым кодом.
Написанная Джеффри Элкнером (Jeffrey Elkner), Алленом Б. Дауни (Allen B. Downey) и Крисом Мейерсом (Chris Meyers), книга несколько лет использовалась учениками старшей школы как учебное пособие для изучения программирования. За это время она вобрала в себя замечания и дополнения сотен ее читателей. В 2010 - 2012 годах я перевел книгу на русский язык и незначительно переработал ее.
В первой части статьи была сделана попытка понять, что есть NULL
, и установлены два аспекта этого явления: в зависимости от контекста, NULL
удобно интерпретировать либо как признак отсутствия значения, либо как неизвестное значение. Были рассмотрены: отсутствие значения в столбце таблицы, и как этого избежать с помощью ограничений целостности; взаимоотношения NULL
и строковых типов VARCHAR2
и CHAR
; использование NULL
в выражениях и в качестве агрумента встроенных функций Oracle, скалярных и агрегатных.
Во второй части я рассмотрю взаимоотношения NULL
и значений типа BOOLEAN
в PL/SQL; эффекты, имеющие отношение к NULL
и результатам подзапросов, а также к оператору IN
; сортировку по столбцу, часть значений в котором отсутствует.
Дыра это просто ничто, но вы можете в ней сломать шею.Остин О'Мэлли
В этой статье я хочу с разных сторон посмотреть на NULL
- явление в мире SQL фундаментальное. Все приведенные ниже примеры выполнены в СУБД Oracle 11gR2.
Наверное, всем известна легенда о мудреце, который попросил у правителя в качестве награды за изобретение шахмат немного риса. Мудрец пожелал, чтобы на первую клетку шахматной доски положили одно зернышко риса, на вторую - в два раза больше, чем на предыдущую (два зернышка), и так далее, пока не будет заполнена вся доска. Обрадовавшись вначале, вскоре правитель понял, что попал впросак...
Что общего между этой легендой и двоичной системой счисления?
В части I рассказано о том, что такое REST и что значит для приложения быть RESTful. На несложном примере проиллюстрирован процесс проектирования RESTful приложения. В части II рассмотрены некоторые детали протокола HTTP в связи с реализацией на его основе RESTful приложений. В частности, рассказано, в чем разница между HTTP-методами POST и PUT, что такое идемпотентность, как обойти ограничения языка HTML и сделать браузерное HTML-приложение RESTful (ну, почти RESTful).
В данной, заключительной части, будут рассмотрены два RESTful приложения, написанные на Python с использованием микрофреймворка Flask. Оба приложения позволяют вести список книг, то есть, просматривать, добавлять, изменять и удалять книги из списка.
Теоретически, RESTful приложение может использовать любой stateless протокол для обмена сообщениями между клиентом и сервером. Практически, RESTful приложения базируются на протоколе HTTP, среди методов которого есть методы GET
, POST
, PUT
и DELETE
.
За аббревиатурой REST (REpresentational State Transfer) стоит модель клиент-серверного приложения, в котором клиент и сервер общаются по stateless протоколу, и программный интерфейс между ними построен с учетом нескольких архитектурных требований.
REST не является технологией, в отличие от SOAP или HTTP. Поэтому нельзя сказать, что приложение использует REST. Приложение может соответствовать модели REST, и тогда говорят, что оно RESTful.
Среди требований к архитектуре RESTful приложения следующие:
Рассмотрим эти требования одно за другим.
В этой статье я собрал запросы, иллюстрирующие типичное использование агрегатных функций. Я начинаю с рассмотрения общих агрегатов (totals), когда агрегатные функции применяются ко всей выборке. Затем рассматриваются частные агрегаты, или субагрегаты (subtotals), получаемые при помощи GROUP BY
, и совместное использование общих и частных агрегатов в запросах. Приводятся примеры запросов для получения доли или процента частных агрегатов в общих. В заключение, даны примеры использования HAVING
.
Предположим, нам нужно узнать количество таблиц, вью и триггеров у пользователей БД SYS
, SYSTEM
и SCOTT
. Первым приходит в голову такое решение:
SQL> SELECT owner, object_type, count(*)
FROM all_objects
WHERE object_type IN ('TABLE', 'VIEW', 'TRIGGER')
AND owner IN ('SYS', 'SYSTEM', 'SCOTT')
GROUP BY owner, object_type
ORDER BY owner, object_type;
OWNER OBJECT_TYPE COUNT(*)
-------------------- -------------------- -----------
SCOTT TABLE 4
SYS TABLE 998
SYS TRIGGER 10
SYS VIEW 3865
SYSTEM TABLE 157
SYSTEM TRIGGER 2
SYSTEM VIEW 12
7 rows selected
Что ж, мы получили ответ на наш вопрос. Но результат не нагляден. Куда нагляднее был бы такой ответ:
OBJECT_TYPE SYS SYSTEM SCOTT
-------------------- ---------- ---------- ----------
TRIGGER 10 2 0
TABLE 998 157 4
VIEW 3865 12 0
Как показано в предыдущих статьях, можно вести счет и запись чисел не только привычными всем десятками, но и "однннадцатками" (Всемирный заговор девятипалых), пятерками или шестерками (До скольки можно посчитать на пальцах?). Иными словами, помимо привычной нам десятичной системы счисления, где счет идет на десятки, существуют и другие системы счисления, где в качестве основания выбрано не десять, а другое число.
При этом число, выбранное в качестве основания системы счисления, определяет, сколько разных значений может принимать один разряд числа, тем самым задавая вес разряда в данной системе счисления.
СУБД Oracle, начиная с версии 8, предоставляет ряд программных интерфейсов для создания расширений (extensibility interfaces). Реализации этих интерфейсов могут быть написаны пользователями СУБД. В частности, это интерфейсы для создания расширений индексирования, расширений стоимостного оптимизатора, пользовательских агрегатных функций.
На базе этих программных интерфейсов компанией Oracle созданы и распространяются вместе с СУБД такие функциональные расширения, как Oracle Text, Oracle Multimedia и Oracle Spatial. Эти расширения Oracle именует data cartridges, а соответствующая технология называется Oracle Data Cartriges (ODC).
Теперь, обрисовав контекст, приступаю к созданию пользовательской агрегатной функции.