В Oracle существует замечательный пакет DBMS_ROWID, а замечателен он тем, что по rowid строки может рассказать всякую информацию о нет, в том числе и сведения, о том, в какой таблице она находится.
понедельник, 26 декабря 2011 г.
понедельник, 31 октября 2011 г.
Oracle Database 11g: Новые возможности в PL/SQL
Для людей желающих прочитать про плюшки, которые есть в Oracle 11g рекомендую почитать этот документ. В нём представлен список новых фишек, которые есть в Oracle 11g
Также есть замечательный вебсайт, но он на английском, где также можно прочитать о новых возможностях разных версий:
Также есть замечательный вебсайт, но он на английском, где также можно прочитать о новых возможностях разных версий:
Динамический SQL
Порой случается, что надо чтобы код выполнял запрос, который заранее точно не известен, для решения таких задач в СУБД Oracle существует 3 способа решения данной задачи.
Здесь я только перечислю те решения, которыми мне доводилось пользоваться, подробности можно почерпнуть из документации Oracle.
Здесь я только перечислю те решения, которыми мне доводилось пользоваться, подробности можно почерпнуть из документации Oracle.
четверг, 20 октября 2011 г.
Primary key и триггер
Поскольку с триггерами у меня мягко говоря не очень, а корпоративная политика гласит: "Триггерами пользоваться сугубо в исключительных ситуациях, когда без них не обойтись" - то изучать их в рабочем процессе не получается.
Но вопрос: "Как сделать автоинкремент primary key?" - меня не отпускал, то я решил найденное решение записать в блог.
Но вопрос: "Как сделать автоинкремент primary key?" - меня не отпускал, то я решил найденное решение записать в блог.
вторник, 18 октября 2011 г.
Индекс порождающий виртуальную колонку
Я, да и не только я, всегда думал что всё что связано с индексами хранится где-то в недрах базы данных и Oracle скрывает от непосвящённых эти данные, но всё оказалось не так просто.
Только что наткнулся на очень интересную штуковину - виртуальную колонку, которую я не создавал. Когда начал разбираться выяснил, что индекс на базе функции может добавить в таблицу колонку, о существовании которой вы даже не догадывались.
В моём случае на одну из колонок был повешен индекс такого вида:
CREATE INDEX IE3_ADDR_DATA ON ADDR_DATA (ADDR_ID ASC, LOWER(VALUE) ASC)
После этого при запросе к словарю данных user_tab_cols видим колонку SYS_NC00007$, которая в поле DATA_DEFAULT содержит LOWER("VALUE") и полу VIRTUAL_COLUMN хранится значение YES.
Будьте осторожны при чтении словарей данных и их использовании в обычной жизни.
Только что наткнулся на очень интересную штуковину - виртуальную колонку, которую я не создавал. Когда начал разбираться выяснил, что индекс на базе функции может добавить в таблицу колонку, о существовании которой вы даже не догадывались.
В моём случае на одну из колонок был повешен индекс такого вида:
CREATE INDEX IE3_ADDR_DATA ON ADDR_DATA (ADDR_ID ASC, LOWER(VALUE) ASC)
После этого при запросе к словарю данных user_tab_cols видим колонку SYS_NC00007$, которая в поле DATA_DEFAULT содержит LOWER("VALUE") и полу VIRTUAL_COLUMN хранится значение YES.
Будьте осторожны при чтении словарей данных и их использовании в обычной жизни.
среда, 31 августа 2011 г.
Сбор статистики по схеме
execute dbms_stats.gather_schema_stats (ownname =>'USR',cascade => TRUE);
Помимо GATHER_SCHEMA_STATS, собирающей статистику по всей схеме, можно собирать статистику по отдельной таблице, индексу и т.п. Это может быть полезно, если требуется ускорить конкретный запрос (можно быстро собрать статистику только по конкретным таблицам). Вот полный список процедур сбора статистики из пакета DBMS_STAT:
Взято с : http://oraclenotes.ru/?p=65
Помимо GATHER_SCHEMA_STATS, собирающей статистику по всей схеме, можно собирать статистику по отдельной таблице, индексу и т.п. Это может быть полезно, если требуется ускорить конкретный запрос (можно быстро собрать статистику только по конкретным таблицам). Вот полный список процедур сбора статистики из пакета DBMS_STAT:
- GATHER_INDEX_STATS
- GATHER_TABLE_STATS
- GATHER_SCHEMA_STATS
- GATHER_DATABASE_STATS
- GATHER_SYSTEM_STATS
Взято с : http://oraclenotes.ru/?p=65
четверг, 9 июня 2011 г.
Индекс для контекстного поиска на основе функции
В Oracle есть замечательная возможность осуществлять контекстный поиск по тексту, который в явном виде не хранится в таблице. Для того, чтобы воспользоваться этой возможностью необходимо написать функцию, которая по rowid целевой таблицы построит соответсвующую ей текстовую строку строку.
среда, 1 июня 2011 г.
Контекстный поиск
Как-то столкнулся я с новой для меня задачей, реализовтаь контектный поиск внутри Oracle.
На русском языке Google сходу выдаёт одну статью, которая конечно помогла мне, но в ней не было по шагам написано что надо сделать, чтобы всё заработало. поэтому здесь я будет краткая справка о том что делать и куда бежать. По сути - это будет пересказ оракловой статьи - Getting Started with Oracle Text.
На русском языке Google сходу выдаёт одну статью, которая конечно помогла мне, но в ней не было по шагам написано что надо сделать, чтобы всё заработало. поэтому здесь я будет краткая справка о том что делать и куда бежать. По сути - это будет пересказ оракловой статьи - Getting Started with Oracle Text.
пятница, 27 мая 2011 г.
NetworkManager не включает беспроводную сетевую карту
Этот пост не совсем про Oracle а про Fedora Linux, на основе которой строится Red Hat Enterprise Linux на базе которого строится Oracle Linux, на котором корпорация Oracle рекомендует разворачивать свою СУБД.
Вобщем симптомы проблемы следующие: после загрузки беспроводная сетевая карта не активна, попытки её включить ни к чему не приводят, она всё также остаётся в состоянии disable, а интерфейс в down, по dmesg мы видим следующее:
[ 7632.355105] iwlagn 0000:03:00.0: PCI INT A disabled
[ 7681.733032] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, in-tree:d
[ 7681.733035] iwlagn: Copyright(c) 2003-2010 Intel Corporation
[ 7681.733114] iwlagn 0000:03:00.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
[ 7681.733124] iwlagn 0000:03:00.0: setting latency timer to 64
[ 7681.733239] iwlagn 0000:03:00.0: Detected Intel(R) WiFi Link 5100 AGN, REV=0x54
[ 7681.754617] iwlagn 0000:03:00.0: device EEPROM VER=0x11f, CALIB=0x4
[ 7681.754619] iwlagn 0000:03:00.0: Device SKU: 0Xb
[ 7681.754643] iwlagn 0000:03:00.0: Tunable channels: 13 802.11bg, 24 802.11a channels
[ 7681.754719] iwlagn 0000:03:00.0: irq 46 for MSI/MSI-X
[ 7681.759905] iwlagn 0000:03:00.0: loaded firmware version 8.83.5.1 build 33692
[ 7681.760899] ieee80211 phy1: Selected rate control algorithm 'iwl-agn-rs'
[ 7717.265118] ADDRCONF(NETDEV_UP): wlan0: link is not ready
[ 7718.948245] ADDRCONF(NETDEV_UP): wlan0: link is not ready
Причина проблемы в модуле ядра acer_wmi, его надо отправить в blacklist и всё чудесным образом заработает.
If Network Manager do not enable your wireless card and you dmesg log look like log on top, just insert module "acer_wmi" into blacklist.
Вобщем симптомы проблемы следующие: после загрузки беспроводная сетевая карта не активна, попытки её включить ни к чему не приводят, она всё также остаётся в состоянии disable, а интерфейс в down, по dmesg мы видим следующее:
[ 7632.355105] iwlagn 0000:03:00.0: PCI INT A disabled
[ 7681.733032] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, in-tree:d
[ 7681.733035] iwlagn: Copyright(c) 2003-2010 Intel Corporation
[ 7681.733114] iwlagn 0000:03:00.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
[ 7681.733124] iwlagn 0000:03:00.0: setting latency timer to 64
[ 7681.733239] iwlagn 0000:03:00.0: Detected Intel(R) WiFi Link 5100 AGN, REV=0x54
[ 7681.754617] iwlagn 0000:03:00.0: device EEPROM VER=0x11f, CALIB=0x4
[ 7681.754619] iwlagn 0000:03:00.0: Device SKU: 0Xb
[ 7681.754643] iwlagn 0000:03:00.0: Tunable channels: 13 802.11bg, 24 802.11a channels
[ 7681.754719] iwlagn 0000:03:00.0: irq 46 for MSI/MSI-X
[ 7681.759905] iwlagn 0000:03:00.0: loaded firmware version 8.83.5.1 build 33692
[ 7681.760899] ieee80211 phy1: Selected rate control algorithm 'iwl-agn-rs'
[ 7717.265118] ADDRCONF(NETDEV_UP): wlan0: link is not ready
[ 7718.948245] ADDRCONF(NETDEV_UP): wlan0: link is not ready
Причина проблемы в модуле ядра acer_wmi, его надо отправить в blacklist и всё чудесным образом заработает.
If Network Manager do not enable your wireless card and you dmesg log look like log on top, just insert module "acer_wmi" into blacklist.
вторник, 24 мая 2011 г.
Расширенные функции Oracle 10g по работе со стеком ошибок
В Oracle 10g возможности для работы со стеком ошибок были расширены. В пакете DBMS_UTILITY появились функции, которые позволяют получить больше информации о том, как ведёт себя программа в случае возникновения исключительной ситуации.
четверг, 19 мая 2011 г.
PIVOT и UNPIVOT в Oracle 11g
В Oracle 11g появились новые функции, которые позволяют разворачивать таблицу. Здесь я приведу пример для быстрого понимания того, как это работает, в конце статьи дам ссылку на чуть более подробное объяснение того как это работает.
среда, 18 мая 2011 г.
Обращение к читателям
Уважаемые читатели моего блога, если у вас есть какие-то вопросы по SQL или PL/SQL, то задавайте их в комментариях к любому посту или пишите мне на почту queer82@gmail.com.
В мире программирования под Oracle есть много вопросов и проблем, так давайте находить решения на них вместе, это поможет нам узнать что-то новое.
В мире программирования под Oracle есть много вопросов и проблем, так давайте находить решения на них вместе, это поможет нам узнать что-то новое.
вторник, 17 мая 2011 г.
Конвейер из табличных (pipelined) функций
Как-то раньше мне не приходилось сталкиваться с задачей, когда приходилось внутри одной табличной функции запрашивать данные из другой табличной функции в передавать их выше, но в конце концов этот момент настал.
Мне было необходимо перегрузить табличную функцию, а поскольку алгоритм обработки данных полностью повторял уже существующий я решил воспользоваться вызовом табличной функции.
Вроде бы всё просто, делай селект типа:
for foo in (select * from pipelined_function(x))
loop
pipe row (r.a, r.b, r.c ...);
end loop;
Но мне хотелось больше удобства, не хотел я писать кучу этих имён в pipe row, и начались поиски решения. Слава богу знаний хватило на то, чтобы прийти вот к такому решению:
Мне было необходимо перегрузить табличную функцию, а поскольку алгоритм обработки данных полностью повторял уже существующий я решил воспользоваться вызовом табличной функции.
Вроде бы всё просто, делай селект типа:
for foo in (select * from pipelined_function(x))
loop
pipe row (r.a, r.b, r.c ...);
end loop;
Но мне хотелось больше удобства, не хотел я писать кучу этих имён в pipe row, и начались поиски решения. Слава богу знаний хватило на то, чтобы прийти вот к такому решению:
понедельник, 16 мая 2011 г.
Регулярные выражения в Oracle 11G
Регулярные выражения являются очень полезным механизмом, многих языков программирования. До Версии 10g в Oracle регулярки не было, и приходилось обходиться обычными строковыми функциями поиска подстроки в строке, что было не всегда удобно. В 11g к уже существующим функциям по работе с регулярными выражениями добавилась ещё одна REGEXP_COUNT и расширился функционал 2х старых REGEXP_INSTR и REGEXP_SUBSTR.
вторник, 3 мая 2011 г.
Оператор Continue
Не знаю, многие ли слышали об этом, но в Oracle 11g появился оператор, который уже давно существует в других языках - Continue.
Суть у него проста, прервать текущую итерацию и перейти к следующей. Лично я серьёзно им никогда не пользовался, иногда применял в скриптовых языках, но дальше дело не доходило.
В любом случае, встречайте CONTINUE собственной персоной:
BEGIN
FOR i IN 1..5 LOOP
dbms_output.put_line('First statement, index is ['||i||'].');
IF MOD(i,2) = 0 THEN
CONTINUE;
END IF;
dbms_output.put_line('Second statement, index is ['||i||'].');
END LOOP;
END;
First statement, index is [1].
Second statement, index is [1].
First statement, index is [2].
First statement, index is [3].
Second statement, index is [3].
First statement, index is [4].
First statement, index is [5].
Second statement, index is [5].
Алгоритм прост. Мы перебираем цифры от 1 до 5 и при помощи функции получения остатка от деления MOD проверяем их на чётность. Если остаток равен 0, то выполняем оператор CONTINUE, которые прерывает текущую итерацию и переходит к следующей, если число не чётное, то выполнение цикла продолжается дальше.
Подстановка текста подпрограмм (subprogram inlining) в Oracle 11g
В Oracle 11g появился новый механизм оптимизации программного кода - использование автоматической инлайн подстановки текста подпрограммы, вместо её вызова. При частых вызовах - эта штука очень хорошо позволяет экономить на накладных расходах. Надо заметить, что данный механизм работает только в случае выставления уровня оптимизации 2 и выше.
четверг, 28 апреля 2011 г.
Начало
Вот и созрел я для того, чтобы завести свой собственный блог по Oracle.
Почему я это делаю? Ведь с сети полным полно всякой информации на эту тему. Ответов много: иногда хочется писать, ради самореализации, иногда хочется поделиться знаниями с людьми, а бывает, что что-то надо записать на память, чтобы не забыть.
Подписаться на:
Сообщения (Atom)