Как пишутся заплатки на oracle признание разработчика
Перейти к содержимому

Как пишутся заплатки на oracle признание разработчика

  • автор:

На чем разрабатывать Oracle разработчику в 2019-м году (и после)

Некоторое время назад я в очередной раз сменил место работы. Новый работодатель был настолько любезен, что разрешил мне выбрать любую IDE, которая понравится, и оплатить лицензию (но в разумных пределах). Также (в кои-то веки) у меня были права администратора на рабочем компьютере, так что я мог ставить что угодно и пробовать сколько угодно. Я попробовал: Oracle SQL Developer, TOAD, Alt SQL Developer и (ВНЕЗАПНО!) IntelliJ IDEA (PL/SQL Developer не пробовал, но много работал раньше). Если вы регулярно пишете PL/SQL код, или хотя бы время от времени делаете запросы к Oracle Database, думаю, вам будет интересно почитать, к каким выводам я пришел.

Сразу хочу предупредить. Не могу сказать, что каждую из IDE изучил досконально, а PL/SQL Developer, кроме всего прочего, видел последний раз 5 лет назад. Поэтому всегда может оказаться, что когда я говорю «этого в IDE нет», на самом деле это там есть, просто я не нашел. А когда я говорю о PL/SQL Developer, я имею в виду версию, кажется, 8 (на которой писал 5 лет назад). Не исключено, что потом там многое изменилось, и не обязательно в лучшую сторону.

Участники соревнований

Итак, что у нас есть? В первую очередь, это то, что можно назвать большой тройкой Oracle-разработки: TOAD, PL/SQL Developer и Oracle SQL Developer. Эти продукты уже давно на рынке, их все знают, у каждого продукта есть своя армия фанатов. Я несколько раз сталкивался с мнением, что TOAD больше любят DBA, а PL/SQL Developer — разработчики. Про Oracle SQL Developer ничего такого не слышал, а армия его фанатов, судя по всему, состоит в основном из менеджеров, — и то только потому, что он бесплатный.

Кроме этого, я решил включить в обзор Alt SQL Developer (продукт, долгое время, а может быть, и до сих пор, разрабатываемый ОДНИМ человеком) и IntelliJ IDEA (он же Гоша, он же Гога, он же DataGrip).

Система там примерно такая: есть IntelliJ IDEA Community Edition — она бесплатная и для джавы. Есть несколько похожих платных продуктов (порядка пары сотен долларов/евро) — RubyMine для Ruby, DataGrip для баз данных, и так далее. И есть IntelliJ IDEA Ultimate Edition, которая дороже всего (примерно 650, кажется), но объединяет в себе функциональность всех продуктов JetBrains. Все эти продукты имеют идентичный интерфейс и очень сильно похожи, благодаря чему переходить с одного на другой проще простого — даже проще, чем с одной версии экселя на другую.
Поэтому далее по тексту мы говорим IDEA — подразумеваем DataGrip, мы говорим DataGrip — подразумеваем IDEA.

PL/SQL Developer

Я начал работать с ораклом в 2011-м году, и это была первая IDE, с которой я столкнулся. Так сложилось, что следующие три года везде, где я работал, использовался именно PL/SQL Developer. Я изучил его довольно неплохо, и он казался отличным инструментом. И хотя 2014-й год был последним годом, когда я запускал эту IDE, даже сейчас она кажется мне неплохим выбором. Главный минус — работает только под Windows.

Oracle SQL Developer

Бесплатная IDE, выпускаемая ораклом. Кроме бесплатности, имеет и другой плюс — кроссплатфоренность. Можно запускать и на линуксах, и на маках. Но, пожалуй, на этом плюсы и заканчиваются. Я ее впервые начал использовать году так в 2015-м. Работает сносно, но есть куча раздражающих мелочей. Дешево и сердито.

Я пробовал начать работать с TOAD несколько раз в свой карьере. Каждый раз я запускал его и тут же у меня возникал вопрос — и чё дальше? Куда нажимать, чтобы начать работать? Последний раз был несколько недель назад, и я наконец-то ее осилил! Разобрался, где какая кнопка, где какая закладка. Эта IDE довольно мощная, но как-то бестолково организованная, имхо. Куча окон и закладок, в которых легко запутаться. И тоже только под Windows.

Alt SQL Developer

Знакомство с этой IDE началось с топика на форуме. На форум пришел какой-то чувак и сказал, что пишет свой PL/SQL Developer с блекджеком и шлюхами. Я никогда не пользовался этой IDE всерьез, только пару недель назад поставил и попробовал поработать один день. Выглядит как PL/SQL Developer, из которого выкинули весь ненужный мусор. К сожалению, несмотря на семилетнюю историю, она до сих пор сыровата. Не помню уже, с чем именно я там столкнулся, но для работы на моем текущем проекте она не применима, к сожалению. И вообще, закрадывается мысль, что автор разработку забросил. А жаль, для продукта, разрабатываемого одним человеком, — это очень достойный результат. Респект, уважуха и лучи поддержки! Опять же, только Windows, но в данном случае не будем придираться.

Intellij IDEA

Вообще-то сначала я просто хотел немного поизучать джаву и писал в этой IDE. А потом для одного из хобби-проектов понадобилось сделать базу на PostgreSQL, и оказалось, что и с БД IDEA отлично справляется! На текущем проекте начал плотно работать с этой IDE и в целом доволен. Правда, без ложки дегтя не обошлось: наткнулся на багу, которая серьезно попортила кровь (IDE перестала показывать объекты одной из схем — на беду, одной из самых необходимых). Написал баг-репорт, воркэраунд посоветовали на форуме JetBrains через пару дней, а до этого пришлось помучиться.

В разговоре с коллегами я как-то упомянул, что некоторое время назад решил начать изучать java — ну так, чисто для себя в основном. Начал с Eclipse, просто потому что слышал про эту IDE раньше. А потом, через год или два, знакомый посоветовал IDEA, я попробовал — и это была любовь с первого взгляда. Казалось, эта IDE понимает меня и чуть ли не читает мысли. Тут один из коллег спросил:
— А чем она тебя так зацепила?
— Ну, даже хотя бы чисто эстетически — там есть темная тема оформления, например.
— Но в Eclipse тоже есть темная тема!
— Нет, ты не понимаешь. Я скачал «Идею», установил, и при первом запуске первое, что она показала — это две картинки рядом. Темная тема или светлая — выбирай.
В этот момент наш фронтэндщик поднял палец вверх и многозначительно изрек:
— ВОООООТ! Юзер экспириенс!

Цена вопроса

Цены взяты с официальных сайтов, из расчета на одного разработчика. Как правило, у всех есть пакеты для большого числа разработчиков, и тогда все еще дешевле.

PL/SQL Developer: 216 долларов + 60 годовая поддержка.
Oracle SQL Developer: бесплатно.
TOAD: 1054 евро (ЛОЛШТО. Может, я просто не туда посмотрел?)
Alt SQL Developer: 99 долларов
DataGrip: 199 евро первый год, 159 второй и по 119 последующие.

Разработка на PL/SQL в IDE

Пишем код

В первую очередь, процесс разработки состоит из чтения и написания кода. Ну, тут понятно: подсветка синтаксиса, автодополнение, навигация, всплывающие подсказки и все такое. Как справляются с этой задачей конкурсанты?

Если брать практическую сторону вопроса, то флагманы уверенно идут впереди. Автодополнение и навигация, имхо, лучше всего работали в PL/SQL Developer. В TOAD и IDEA чуть хуже, а вот Oracle SQL Developer мне так и не удалось заставить автодополнять удобным мне способом (а кроме того, у меня в нем постоянно слетают настройки — они почему-то вообще не сохраняются при выходе). Отдельно хочу отметить такой мелкий нюанс: если окно предложений для автодополнения уже закрылось по какой-то причине, то PL/SQL Developer умеет показывать его снова по Ctrl+Пробел. А еще всплывающие подсказки с названиями и типами агрументов функций. Остальные IDE не умеют, а если и умеют, то я не знаю, по какой клавише, и как эти опции называются в настройках, я тоже не знаю.

Также у PL/SQL Developer было еще несколько прикольных фишек, нужных именно для работы с SQL: сгенерировать в один клик перечень всех полей таблицы через запятую, поиск по коду в ALL_SOURCE, специальный режим отображения результатов селектов, когда поля идут в столбик, а в соседнем столбике одна строка данных. ОЧЕНЬ удобно, когда нужно посмотреть, какие поля и какие примерно данные есть в незнакомой таблице. Из всего этого у конкурентов я нашел только в IDEA поиск по коду и генерацию списка столбцов таблицы.

Настройки форматирования SQL и PL/SQL тоже есть у всех, более-менее одинаковые по мощности, и превью тоже есть. Разве что у TOAD они как-то слишком сложно сформулированы.

А вот с эстетической стороной вопроса флагманы справляются как-то не очень. Если в IDEA есть целая темная тема, то в остальных можно максимум сделать темный фон в редакторе кода. Фон в других окнах останется белым (в PL/SQL Developer, помнится, это частично тоже настраивается, но все в разных местах, чокнуться можно, у остальных вообще никак). Oracle SQL Developer единственный из оставшихся имеет несколько готовых наборов цветов для подсветки синтаксиса, включая набор с темным фоном. Остальные IDE по умолчанию имеют просто вырвиглазные высококонтрастные цветовые схемы и шрифт Courier new — имхо, самый уродливый моноширинный шрифт в этой части Вселенной. IDEA использует шрифт Consolas, он как-то поприятнее. Отдельно отличился TOAD (у меня версия 11.5): там есть баг, из-за которого символы %, &, * и ^ (а первые три очень часто используются в PL/SQL) не попадают ни в один набор символов в настройках, что приводит к невозможности задать им цвет шрифта. То есть они всегда остаются черными, и темная тема означает боль и страдания. И это продукт за штуку зелени? Это фиаско, братан.

Запросы, PL/SQL блоки и скрипты

Тут все на удивление ровно. Работа выглядит более-менее одинаково у всех, хотя без небольших сюрпризов не обходится. В Oracle SQL Developer очень неудобно включается вывод в консоль (нужно больше одного клика мышкой), а IDEA выводит таймстемпы, которые не отключаются — это мешает отлаживать процедуры, использующие динамический SQL.

Еще TOAD и IDEA умеют делать экспорт данных из таблицы в виде INSERT выражений.

PL/SQL Developer имел честный режим эмуляции SQL*Plus — отдельное окно, куда можно писать команды прямо как в самом SQL*Plus — с выводом прямо тут же. Остальные могут просто тупо выполнять скрипты, а output выплевывать в соседнее окно.

Еще стоит сказать об умении определять границы SQL-запросов. Oracle SQL Developer, PL/SQL Developer и Alt SQL Developer требуют обязательно отделять запросы точкой с запятой (а PL/SQL блоки — слэшем), а иначе они не понимают, где один запрос закончился, а другой начался. IDEA в этом плане немного умнее (и TOAD, кажется, тоже) — там можно написать два корректных запроса, не отделяя их друг от друга точкой с запятой, поставить курсор на один из них и выполнить его. Кроме того, IDEA перед запуском обводит распознанный запрос зеленой рамочкой, дополнительно позволяя убедиться, что выполнится именно то, что нужно.

Еще один важный пункт — это пошаговая отладка, но она, кажется, выглядит одинаково вообще у всех IDE, начиная чуть ли не с TurboPascal 7.0. И да, буквально неделю назад на форуме JetBrains написали, что пошаговая отладка PL/SQL в IDEA готова. Народ уже во всю тестирует.

Браузер объектов

Самые удобные браузеры объектов — у PL/SQL Developer и Alt SQL Developer. У них есть панелька слева с браузером, а справа можно писать код, а у PL/SQL Developer еще в добавок были возможности поиска и фильтрации объектов в той же панели. У Oracle SQL Developer почти так же хорошо, но мне нравится немного меньше. У TOAD мне не нравится то, что если смотришь браузер объектов, то в левой панели показаны собственно объекты, а справа, на остальной части экрана, отображаются их многочисленные свойства. А сделать так, чтобы слева были объекты, а справа — редактор кода, не получится. То есть информации TOAD дает может даже и побольше, но юзабилити — не его конек. У IDEA браузер объектов — самое слабое место, на троечку с минусом. С одной стороны, их можно понять, не ораклом единым, и даже не одними реляционными БД жив DataGrip, а с другой: назвался груздем — полезай в короб.

Зато IDEA умеет рисовать ER-диаграммы для уже существующих в БД таблиц, и вызывается эта функция из браузера объектов. За это ей жирный плюс.

Контроль версий

С контролем версий ситуация тяжелая. Так исторически сложилось (уж не знаю как, но это факт), что люди, работающие с Oracle, в основной своей массе довольно дремучи в вопросах организации процессов разработки в команде. Можете представить себе Senior Java (или С/С++/фронтенд) девелопера, который ни разу в жизни не работал ни с одной системой контроля версий? А вот Senior Oracle девелопера можно найти довольно легко — последнего такого я видел не далее как в прошлом году. Про тесты и говорить не приходится (на прошлой работе я показал нашему «лиду» APEX-разработки простенький тестик на Java + Selenium, а он мне в ответ — «Ни в коем случае! Никаких тестов! Это ж в два раза больше работы — и тесты, и код поддерживать!»), а за выражение «Continuous Integration», кажется, меня бы там убили на месте (поэтому я не выражался).
По этой причине мне не удалось толком протестировать возможности по работе с системами контроля версий PL/SQL Developer и Oracle SQL Developer.

Перед написанием этой статьи я запустил Oracle SQL Developer на домашнем компе. Подключился к репозиторию, сделал clone, изменил файл, посмотрел изменения в окне сравнения версий, нажал commit… Получил java exception , расписался . Но у меня старая версия, двух- или трехлетней давности. На работе стоит свежая, она этот тест с честью прошла. Ха-ха.

Я работал в IDEA с git, и IDEA в этом плане идеальна. Мои коллеги используют SourceTree для работы с гитом (я использую и то, и то), и я могу сказать, что IDEA переигрывает SourceTree на его же поле — при том, что SourceTree вообще ничего другого не умеет.

У остальных IDE пункт в меню для работы с системами контроля версий номинально присутствует, но больше я ничего не знаю.

Выводы, которые я для себя сделал

По соотношению цена/качество с большим отрывом выигрывает Oracle SQL Developer: еще бы, если ноль поделить на какое-нибудь число, получится ноль 😉 А если отбросить шутки, то кросс-платформенность и бесплатность — практически единственные его плюсы. И чисто с идеологической точки зрения: если посмотреть на финансовые возможности разработчиков перечисленных IDE, то Oracle — самая богатая компания. Однако, если брать фактическую функциональность и удобство работы, их софтина — самая убогая.

Alt SQL Developer — тоже довольно простенькая программка, и, имхо, она не стоит даже тех 99 баксов, которые за нее просят. Но ёлки-палки: во-первых, она довольно качественно косплеит PL/SQL Developer, а во-вторых, написана одним человеком в свободное от работы время, а не корпорацией с многомиллиардной стоимостью. Упоминания в одном ряду с флагманами она точно заслужила.

TOAD — мощная софтина, но с нечеловечески неудобным интерфейсом и запредельной стоимостью. Я не знаю, как можно за нее платить штуку баксов (все еще надеюсь, что просто не туда посмотрел). 200 — я б еще подумал и все равно бы не купил .

PL/SQL Developer — был моим идеалом до появления IDEA. Перечитав эту статью, понял, что PL/SQL Developer даже пятилетней давности был лучше, чем большинство его конкурентов сейчас.

Какую IDE выбрал я?

Я на данный момент выбрал IntelliJ IDEA и хочу попробовать объяснить, почему. Казалось бы, некоторые вещи она умеет хуже, чем конкуренты (браузер объектов), а в остальном — плюс-минус то же самое. Но, тем не менее, IDEA имеет несколько киллер-фич, которые с лихвой перевешивают недостатки. О них чуть подробнее.

Live Template. Совершенно невозможно не упомянуть одну из киллер фич IDEA — Live Template. Что такое Code Template — знают более-менее все, и во всех оракловых IDE это есть. Вы пишете условное сокращение, а IDE заменяет его длинным. Например, вы можете сделать настройку, чтобы IDE заменяла «sft» на «select * from «. В IDEA пошли дальше, и эта функция называется Live Template. Вы можете внутрь шаблона вставить специальные выражения, обрамленные знаками «$», и IDEA не только сделает автозамену, но и по нажатию на Enter будет перемещать курсор по тем местам, где стояли эти выражения.

Допустим, у вас есть переменная MY_COL , которая содержит коллекцию. Нужно написать PL/SQL код для обработки этой коллекции. Можно просто написать, а можно сделать шаблон! Заходим в Settings, находим пункт Live Template, справа нажимаем на плюсик.
Заполняем: Abbreviation — ну, например, «fori». Description — по желанию. Template text — вводим туда следующее:

Внизу нужно еще выбрать Applicable context. Это нужно для того, чтобы для разных языков можно было использовать одинаковые сокращения. Нажимаем ОК. Теперь в редакторе: набираем fori, потом нажимаем TAB. Появляется шаблон кода, а на месте $collection$ появляется красная рамка и курсор. Теперь нужно набрать «my_col» и нажать Enter. У вас должно получиться:

Причем обратите внимание — курсор появится на месте $END$, то есть не после вашей конструкции, а где-то внутри, — вы управляете этим поведением!
По описанию это может быть не очень понятно, поэтому лучше поставьте IDE и поупражняйтесь. Гарантирую, вам понравится.

Refactoring. Просто автозамена текста есть у всех, даже в блокноте, наверное. А вот чего у «большой тройки» нет, так это чуть более интеллектуальной автозамены. Если у вас в пакете есть несколько функций, в которых используются переменные или параметры с одинаковым названием (и даже если просто такое сочетание символов используется где-то еще), то автозамена переименует их все. А если нужно переименовать именно переменную в одной из функций, то тут придется следить и делать автозамену в полуавтоматическом режиме. IDEA решила эту проблему — по Shift+F6 вы можете переименовать именно то, что вам нужно. И это только цветочки, рефакторинг — это немного более сложная штука.

В 2009-м году известный специалист по проектированию интерфейсов Алан Купер выпустил третье издание своей книги «Об интерфейсе». Там он, в частности, обратил внимание читателя на такой странный факт: любая прикладная программа для обработки хоть каких-то пользовательских данных (тут имеется в виду любая из реально существующих — ну там Word, Excel, notepad, Paint, и так далее) может создать файл, дать ему имя, писать в него данные и т. п., но ни одна (. ) не умеет переименовывать уже открытый этой же программой файл, хотя никаких ограничений со стороны ОС для этого нет. Для переименовывания файла закройте его, обратитесь к услугам ОС, потом откройте заново. Юзабилити, ага.

Это была присказка, сказка будет впереди. Таки IDEA эту функцию осилила. Не прошло и 10 лет, как говорится. Переименование файлов — это часть функциональности рефакторинга.
Ждем остальных.

Code Inspection Кто давно читает Хабр, тот наверняка видел регулярно появляющиеся статьи одной компании, разрабатывающей свой продукт для статического анализа, и наверняка успел проникнуться самой этой концепцией. Как внезапно оказалось, в IDEA есть некоторый набор правил и для анализа PL/SQL. Там, конечно, набор пока бедненький, и я уже собираюсь закинуть им Feature Request с несколькими новыми правилами, но даже то, что есть, способно принести немного пользы. Проверив всего один пакет наугад, я нашел одну неиспользуемую переменную и четыре… эээ… как это по-русски. unreachable statements. А потом оказалось, что эти unreachable statements образовались случайно, когда текст правили, и в итоге это были таки баги.

Запуск скриптов. IDEA умеет запускать bat/bash файлы, это настраивается прямо из IDE. Предельно просто: открываем соответствующий файл, IDEA предлагает поставить плагин для работы с этим типом файлов, соглашаемся, плагин сам ставится (за несколько секунд), конфигурируем запуск, работаем дальше. Очень удобно, если вы пользуетесь скриптами для запуска SQL*Plus. Также мы используем модульные тесты для PL/SQL, написанные на Ruby, и точно также они запускаются из той же IDE (но для Ruby вам уже придется ставить IDEA Ultimate Edition, DataGtip не подойдет).

Usability. В конце концов, IDEA — это просто удобно. У IDEA есть куча плагинов. Просто плагинами уже никого не удивишь, они есть вообще везде. Но IDEA может, например, сама определить, что у нее есть плагин, который может вам помочь. Типовой кейс — вы открываете какой-то файл, IDEA выводит сообщение «существует плагин для работы с этим типом файлов» и предлагает его скачать и сконфигурировать. И вообще, часто, когда случается какая-то непонятная фигня, IDEA показывает всплывающую менюшку со списком возможных действий по исправлению этой фигни. Очень приятная забота о пользователе.

У IDEA есть поиск по справке. Если вы знаете название какой-то фичи IDE, вам достаточно зайти в справку и набрать это название в поисковой строке, далее IDE вам сама стрелочкой покажет, где эта функция.

TL;DR IDEA — это айфон от PL/SQL разработки. Могу только пожелать разработчикам IDEA дальнейших успехов, а разработчикам остальных IDE хочу напомнить, что динозавры, которые не смогли эволюционировать — вымерли.

Как пишутся заплатки на oracle признание разработчика

Для диагностики проблемы необходимо включить проверку кодировки в PLSQL Developer

Картинка 1.


Картинка 2.

Пытаемся подключиться к базе.
У меня появилось такое вот полезное предупреждение:

Картинка 3.

Оставалось добавить NLS_LANG в виде переменной окружения. После перезапуска plsql developer все заработало как надо.

Картинка 4.

PL / SQL – Процедуры

  • На уровне схемы
  • Внутри упаковки
  • Внутри блока PL / SQL

Части подпрограммы PL / SQL

Режимы параметров в подпрограммах PL / SQL

Пример режима IN & OUT 1
Пример 2 в режиме IN & OUT
  • Позиционная запись
  • Именное обозначение
  • Смешанная запись

Oracle права на схему

  • [пользователь] [Username] – Имя пользователя (название схемы).
  • [пароль] [Password] – Пароль для учетной записи.
  • DEFAULT TABLESPACE – Табличное пространство в котором будут находиться создаваемые в данной схеме объекты. Эта настройка не дает пользователю права создавать объекты – здесь устанавливается только значение по умолчанию.
  • TEMPORARY TABLESPACE – Табличное пространство, в котором находятся временные сегменты, используемые в процессе сортировки транзакций.
  • QUOTA – Позволяет пользователю сохранять объекты в указанном табличном пространстве, занимая там место вплоть до определенного в квоте общего размера.
  • CREATESESSION – права на подключения. Без этих прав вы даже не сможете подключиться к БД
  • RESTRICTEDSESSION – Если БД запущена с директивой STARTUPRESTRICT или применялась команда ALTERSYSTEMENABLERESTRICTEDSESSION, то только пользователи с этими правами смогут подключаться к БД
  • ALTERDATABASE – разрешает выполнять команды влияющие на физические структуры
  • ALTERSYSTEM – разрешает изменять параметры экземпляра и структуры памяти
  • CREATETABLESPACE – вместе с ALTERTABLESPACE и DROPTABLESPACE позволяют пользователю управлять табличными пространтсвами
  • CREATETABLE – позволяет gratee создавать таблицы в своей схеме; включает возможность создавать, изменять и удалять таблицы, выполнять команды DML и select и управлять индексами
  • GRANTANYOBJECTPRIVILEGE – позволяет grantee управлять правами объектов которые ему не принаджлежат, но не даёт прав ему самому
  • CREATEANYTABLE – grantee может создавать таблицы которые принадлежат другим аккаунтам
  • DROPANYTABLE – grantee позволяется удалять таблицы которые принадлежат другим аккаунтам
  • INSERTANYTABLE, UPDATEANYTABLE, DELETEANYTABLE – даёт grantee право выполнять DML команды над объектами которые ему не принадлежат
  • SELECTANYTABLE – Даёт право grantee выполнять SELECT к любмы таблицам.

GRANT privilege [,privilege…] TO username;

grant create session, alter session,

create table, create view, create synonym, create cluster,

create database link, create sequence,

create trigger, create type, create procedure, create operator

grant create table to scott with admin option;

grant create table to jon;

Revocation of a system privilege will not cascade (unlike

revocation of an object privilege).

grant select any table to scott

In fact, ANY is not as dangerous now as with earlier releases. It no longer

includes tables in the SYS schema, so the data dictionary is still protected. But

ANY should still be used with extreme caution, as it removes all protection

from user tables.

The ANY privileges, that grant permissions against objects in

every user account in the database, are not object privileges—they are

GRANT privilege ON [schema.]object TO username [WITH GRANT OPTION];

grant select on store.customers to scott;

grant select on store.orders to scott;

grant update (order_status) on store.orders to scott;

grant all on store.regions to scott;

Granting privileges at the column level is often said to be bad practice

because of the massive workload involved. If it is necessary to restrict peoples’

access to certain columns, creating a view that shows only those columns will

often be a better alternative.

Основы PL/SQL

Структура/Архитектура QlikView Extensions

Programming Language for SQL (PL/SQL) – решение Oracle, предоставляющее средства, которые позволяют выполнять сложную обработку информации (plsql).

Программные единицы PL/SQL

  • Процедура — это подпрограмма, которая выполняет специфическое действие (CREATE PROCEDURE).
  • Функция — это подпрограмма, которая вычисляет значение (CREATE FUNCTION).
  • PL/SQL пакеты — это объект базы данных, который группирует логически связанные типы, программные объекты и подпрограммы PL/SQL. Пакеты обычно состоят из двух частей — спецификации и тела. Спецификация пакета — это интерфейс с вашими приложениями, она объявляет типы, переменные, константы, исключения, курсоры и подпрограммы, доступные для использования в пакете. Тело пакета полностью определяет курсоры и подпрограммы, тем самым реализуя спецификацию пакета (CREATE PACKAGE и CREATE PACKAGE BODY).
  • Динамический SQL
    • Native Dynamic SQL (NDS)
    • DBMS_SQL

    Структура блока PL/SQL

    Блок PL/SQL может содержать до четырех разделов, однако только один из них является обязательным.

    • Заголовок. Используется только в именованных блоках, определяет способ вызова именованного блока или программы. Не обязателен.
    • Раздел объявлений. Содержит описания переменных, курсоров и вложенных блоков, на которые имеются ссылки в исполняемом разделе и разделе исключений. Не обязателен.
    • Исполняемый раздел. Команды, выполняемые ядром PL/SQL во время работы приложения. Обязателен.
    • Раздел исключений. Обрабатывает исключения (предупреждения и ошибки). Не обязателен.

    Структура блока PL/SQL для процедуры показана на рисунке:
    block_plsql
    Рисунок «Процедура, содержащая все четыре раздела»:
    procedure_structure_plsql

    Хранимая процедура

    Хранимая процедура — это определенный набор инструкций, написанных на языке PL/SQL. Вызов процедуры приводит к выполнению содержащихся в ней инструкций. Процедура хранится в базе данных, поэтому и называется хранимой. Процедура состоит из двух основных частей:спецификации и тела.
    Спецификация процедуры (procedure specification) включает в себя имя процедуры и описание ее входных и выходных данных. Эти входные и выходные данные называются формальными параметрами (formal parameters) или формальными аргументами (formal arguments). Если при вызове процедуры указываются параметры командной строки или другие входные данные, эти значения называются фактическими (actual) параметрами или фактическими аргументами.
    Пример спецификации

    Здесь мы видим процедуру с тремя формальными параметрами. Слово IN после имени параметра означает, что при вызове процедура может считать из этого параметра входное значение. Слово OUT означает, что процедура может использовать данный параметр для возврата значения в ту программу, из которой она была вызвана. Комбинация IN OUT после имени параметра говорит о том, что параметр может использоваться как для передачи значения процедуре, так и для возврата значения.
    Тело процедуры (procedure body) — это блок PL/SQL-кода.

    Хранимые функции

    Функция PL/SQL похожа на процедуру PL/SQL: она также имеет спецификацию и тело. Главное различие между процедурой и функцией в том, что функция предназначена для возврата значения, которое может использоваться в более крупном SQL-Операторе.

    Триггеры

    Триггер — это процедура PL/SQL, которая выполняется автоматически, когда происходит некоторое заданное событие, называемое триггерным событием (triggering event).
    Например, можно писать триггеры, срабатывающие при выполнении над таблицей операций INSERT, UPDATE или DELETE; при выдаче команд DDL; при входе пользователя в систему или его выходе из системы; при запуске или останове базы данных; при возникновении ошибок.
    Между триггерами и процедурами PL/SQL есть три различия:

    • Триггеры нельзя вызывать из кода программы. Oracle вызывает их автоматически в ответ на определенное событие.
    • Триггеры не имеют списка параметров.
    • Спецификация триггера немного отличается от спецификации процедуры.

    Структура блока PL/SQL

    Базовый блок PL/SQL состоит из четырех секций:

    • секции заголовка (header section);
    • необязательной секции объявлений (declaration section);
    • выполняемой секции (execution section);
    • необязательной секции исключений (exception section).

    Анонимный блок (anonumous block) — это блок PL/SQL без секции заголовка, иначе говоря, секции имени, поэтому он и называется анонимным. Анонимные блоки могут выполняться из SQL*Plus и использоваться в функциях, процедурах и триггерах PL/SQL. Вспомните, что сами процедуры, функции и триггеры также состоят из базовых блоков. Это означает, что базовый блок можно помещать в другой базовый блок.

    Секция объявлений

    Секция объявлений не является обязательной. В случае использования она начинается после секции заголовка и оканчивается перед ключевым, словом BEGIN. Эта секция содержит объявления переменных, констант, курсоров, исключений, функций и процедур PL/SQL, которые будут использоваться в выполняемой секции и секции исключений. Все объявления переменных и констант должны размещаться до объявлений функций или процедур. О переменных и константах PL/SQL будет подробно рассказано в следующем разделе. Объявление сообщает PL/SQL о том, что нужно создать переменную, константу, курсор, функцию или процедуру согласно приведенной спецификации. Когда выполнение базового блока завершается, все элементы, объявленные в секции объявлений, перестают существовать. Элементы, объявленные в секции объявлений базового блока, могут использоваться только в пределах этого блока. Одним словом, все, что находится в секции объявлений, при надлежит блоку и может использоваться только внутри него, а следовательно, существует только на протяжении его времени жизни. Часть кода, в которой может использоваться переменная, называется областью видимости (scope).

    Выполняемая секция

    Выполняемая секция начинается с ключевого слова BEGIN и заканчивается либо ключевым словом EXCEPTION, если присутствует секция исключений, либо ключевым словом END, за которым следуют необязательное имя функции или процедуры и точка с запятой. Выполняемая секция содержит один и более PL/SQL-операторов, выполняемых при передаче управления данному блоку. Структура выполняемой секции показана ниже.

    В выполняемом коде PL/SQL чаще всего встречается оператор присваивания (:=). Он указывает, что нужно вычислить выражение справа и поместить результат в переменную слева.

    Секция исключений

    В ходе выполнения PL/SQL-оператора может возникнуть ошибка, которая сделает невозможным дальнейшее выполнение программы. Такие исключительные ситуации называются исключениями (exceptions). Пользователь, вызвавший процедуру, должен быть проинформирован о возникновении исключения, а также о причинах, его вызвавших. Вы можете выдать пользователю содержательное сообщение об ошибке, или предпринять некоторые корректирующие действия и повторить операцию, выполнявшуюся до возникновения ошибки. Вы также можете откатить изменения, которые были произведены в базе данных к этому моменту. PL/SQL помогает вам во всех этих случаях, предоставляя средства обработки исключений (exception handling).

    Секция исключений начинается с ключевого слова EXCEPTION и продолжается до конца блока. Каждому исключению соответствует оператор WHEN имя_исключения, указывающий, что должно быть сделано при возникновении данного исключения. Все операторы, находящиеся между оператором, вызвавшим ошибку, и секцией исключений, игнорируются. Выполнение оператора, указанного в секции исключений, называется обработкой исключения (exception handling). Процесс, включающий в себя обнаружение ошибки, определение, какое исключение описывает ее наилучшим образом, и передачу PL/SQL информации, позволяющей найти соответствующий код в секции исключений, называется возбуждением исключения (raising exception).

    Переменные

    Переменные — это именованные контейнеры. Они могут содержать информацию (данные) различных видов. В зависимости от того, какую информацию в них можно помещать, они имеют различные типы данных, а чтобы отличать их друг от друга, им присваиваются имена. PL/SQL хранит числа в переменных типа NUMBER, а текст — в переменных типа CHAR или VARCHAR2. Синтаксис объявления переменной в PL/SQL может иметь любую из следующих форм:

    Имя_переменной — это любой правильный идентификатор PL/SQL. Правильный идентификатор PL/SQL должен:

    • Иметь не более 30 символов в длину и не содержать пробельных символов (собственно пробелов и знаков табуляции).
    • Состоять только из букв, цифр от 0 до 9, символа подчеркивания (_), знака доллара ($) и знака фунта (#).
    • Начинаться с буквы.
    • Не совпадать с зарезервированными словами PL/SQL или SQL, которые имеют специальное значение. Например, именем переменной не может быть слово BEGIN, которое обозначает начало выполняемой секции базового блока PL/SQL.

    Тип_данных — это любой допустимый тип данных SQL или PL/SQL. Модификатор NOT NULL требует, чтобы переменная имелазначение. Если он указан, переменной должно быть присвоено значение по умолчанию.

    Объявление констант PL/SQL

    Синтаксис объявления константы имеет следующий вид:

    В отличие от переменных константам обязательно присваивается значение, которое нельзя изменять на протяжении времени жизни константы. Константы очень полезны для поддержания безопасности и дисциплины при разработке больших и сложных приложений. Например, если вы хотите гарантировать, что процедура PL/SQL не будет модифицировать передаваемые ей данные, можете объявить их константами. Если процедура все же попытается их модифицировать, PL/SQL возбудит исключение.

    Оператор IF

    Оператор IF имеет следующий синтаксис:

    Действие_1 … альтернативное Действие представляют один или несколько PL/SQL-операторов. Каждая группа операторов выполняется только в том случае, если выполнено соответствующее условие. После того как обнаружено выполнение одного из условий, остальные условия не проверяются.

    Циклы

    PL/SQL предоставляет три различные конструкции для итеративной обработки. Каждая из них позволяет циклически выполнять набор операторов PL/SQL. Выход из цикла осуществляется в зависимости от некоторого условия.

    Конструкция LOOP имеет следующий синтаксис:

    При наличии конструкции WHEN все операторы в теле цикла повторяются до тех пор, пока выражение условие_выхода не примет положительное значение (т.е. не станет истинным). Условие выхода проверяется на каждом проходе, иначе называемом итерацией. Как только выражение принимает значение «истина», все операторы после EXIT пропускаются, итерации прекращаются и выполнение продолжается с первого оператора, следующего за END LOOP. Если условие WHEN отсутствует, операторы между LOOP и EXIT выполняются только один раз. Очевидно, что опустив условие WHEN, вы поступите нелогично. В конце концов идея цикла состоит в том, чтобы обеспечить потенциально многократное выполнение кода.

    Цикл WHILE

    Еще одной разновидностью цикла является цикл WHILE. Он хорошо подходит в ситуациях, когда количество итераций заранее неизвестно, и определяется некоторым внешним фактором. Цикл WHILE имеет следующий синтаксис:

    Условие WHILE проверяется перед каждым входом в цикл. Если оно имеет значение «истина», то выполняется очередная итерация.

    Цикл FOR

    В цикле FOR для подсчета итераций используется переменная-счетчик, называемая также индексом цикла (loop index). По завершении каждой итерации счетчик увеличивается, начиная с нижнего предела, или уменьшается, начиная с верхнего предела. Как только его значение выйдет за указанный диапазон, цикл завершается. Синтаксис цикла FOR выглядит следующим бразом:

    Курсоры

    Курсор — это исключительно важная конструкция PL/SQL, лежащая в основе взаимодействия PL/SQL и SQL. Название «курсор» означает «текущий набор записей». Курсор представляет собой специальный элемент PL/SQL, с которым связан SQL-оператор SELECT. Используя курсор, можно отдельно обрабатывать каждую строку связанного с ним SQL-оператора. Курсор объявляется в секции объявлений базового блока. Он открывается командой OPEN, а выборка строк осуществляется с помощью команды FETCH. После завершения всей обработки курсор закрывается командой CLOSE. Закрытие курсора освобождает те системные ресурсы, которые использовались, пока он был открыт. Строки, выбранные курсором, можно заблокировать, чтобы предотвратить их модификацию другими пользователями. Закрытие курсора или выполнение явной операции COMMIT или ROLLBACK приведет к разблокированию строк. Для SQL-операторов, используемых в коде PL/SQL, применяются скрытые, или неявные (implicit), курсоры, а также явные (explicit) курсоры, т.е. те, которым присвоено имя.

    Объявление курсора и атрибуты курсора

    Курсор объявляется в процедуре PL/SQL следующим образом:

    Параметры курсора похожи на параметры процедуры, за тем исключением, что они всегда являются входными (IN). Использование параметров OUT или IN OUT невозможно, поскольку курсор не может их модифицировать. Параметры используются в конструкции WHERE курсорного оператора SELECT. Спецификация возврата показывает, записи какого типа будут выбираться оператором SELECT. Таблица_или_столбец — это имя столбца, который предстоит обновлять, или имя таблицы, в которой предстоит удалять или обновлять строки. Оно должно входить в число имен таблиц и столбцов, указанных в операторе SELECT курсора, и предназначено для документирования, показывая, какие элементы могут быть потенциально модифицированы кодом, использующим данный курсор. Команда FOR UPDATE блокирует строки, выбранные оператором SELECT при открытии курсора. Строки остаются заблокированными до тех пор, пока вы не закроете курсор рассмотренными выше способами. Атрибуты курсора:

    • имя_курсора%ISOPEN — Позволяет проверить, открыт ли курсор. Если курсор имя_курсора уже открыт, возвращается значение TRUE
    • имя_курсора%ROWCOUNT — Количество строк таблицы, возвращенных оператором SELECT курсора
    • имя_курсора%FOUND — Позволяет проверить, была ли успешной последняя попытка получения записи из курсора. Если запись была выбрана, то возвращается значение TRUE
    • имя_курсора%NOTFOUND — Противоположен атрибуту FOUND. Если записей больше не найдено, возвращается значение TRUE

    Записи PL/SQL

    Запись PL/SQL— это набор данных базовых типов. К ней можно обращаться, как к единому целому. Для доступа к отдельным полям записи применяется нотация имя_записи_имя_поля, которую вы уже использовали для столбцов таблицы. Записи могут иметь один из трех типов, перечисленных ниже; вы можете объявлять переменные, имеющие тип записи.

    • Основанные на таблице (table-based) Эти записи имеют поля, совпадающие по имени и типу со столбцами таблицы. Если курсор выбирает всю строку — например, оператором SELECT * FROM некоторая_таблица — то возвращаемые им записи можно непосредственно копировать в переменную, имеющую тип записи, основанной на таблице некоторая_таблица.
    • Основанные на курсоре (cursor-based) Поля этих записей совпадают по имени, типу и порядку с заключительным списком столбцов в курсорном операторе SELECT.
    • Определенные программистом (programmer-defined) Это записи, тип которых определяете вы сами.

    Использование команд OPEN, FETCH и CLOSE

    Команды открытия курсора, выборки из курсора и закрытия курсора имеют следующий синтаксис:

    После открытия курсор содержит набор записей, если в результате успешного выполнения оператора SELECT из базы данных были выбраны заданные строки. Каждая команда FETCH удаляет запись из открытого курсора и перемещает ее содержимое либо в переменную PL/SQL, тип записи которой совпадает с типом записи курсора, либо в группу переменных PL/SQL, где каждая переменная в списке совпадает по типу с соответствующим полем в записи курсора. Перед тем как пытаться выбрать из курсора очередную запись, следует проверить с помощью атрибутов FOUND и NOTFOUND, есть ли в нем еще записи. Выборки из пустого курсора будут все время давать последнюю запись, не приводя к ошибке. Не забывайте проверять атрибуты FOUND и NOTFOUND при использовании FETCH. Фактическая обработка записей из курсора обычно выполняется внутри цикла. При написании такого цикла неплохо начать с проверки, была ли найдена запись в курсоре. Если да, можно продолжать необходимую обработку; в противном случае следует выйти из цикла. То же самое можно сделать более коротким путем, использовав курсорный цикл FOR. При этом PL/SQL будет осуществлять открытие, выборку и закрытие без вашего участия.

    Курсорный цикл FOR

    Синтаксис курсорного цикла FOR имеет следующий вид:

    Этот цикл выбирает записи из курсора в переменную типа запись_курсора. Поля записи_курсора можно использовать для доступа к данным из операторов PL/SQL, выполняемых в цикле. Когда все записи выбраны, цикл завершается. Для удобства открытие и закрытие курсора производится автоматически. Попытавшись выбрать запись из неоткрытого курсора, вы получите сообщение in valid cursor (недействительный курсор). Если не закрывать курсоры, то в конце концов количество открытых курсоров достигнет максимальной величины, допускаемой системой.

    Конструкция WHERE CURRENT OF

    Когда курсор открывается для обновления или удаления выбранных записей, можно использовать конструкцию WHERE CURRENT OF имя_курсора для доступа к таблице и строке, которые соответствуют последней записи, выбранной в конструкции WHERE оператора UPDATE или DELETE.

    Обработка ошибок

    В языке PL/SQL ошибки всех видов интерпретируются как исключения — ситуации, которые не должны возникать при нормальном выполнении программы.
    К числу исключений относятся:

    • ошибки, генерируемые системой (например, нехватка памяти или повторяющееся значение индекса);
    • ошибки, вызванные действиями пользователя;
    • предупреждения, выдаваемые приложением пользователю.

    exception_plsql

    PL/SQL перехватывает ошибки и реагирует на них при помощи так называемых обработчиков исключений. Механизм обработчиков исключений позволяет четко отделить код обработки ошибок от основной логики программы, а также дает возможность реализовать обработку ошибок, управляемую событиями. Независимо от того, как и по какой причине возникло конкретное исключение, оно всегда обрабатывается одним и тем же обработчиком в разделе исключений.
    При возникновении ошибки — как системной, так и ошибки в приложении — в PL/SQL инициируется исключение. В результате выполнение блока прерывается, и управление передается для обработки в раздел исключений текущего блока, если он имеется. После обработки исключения возврат в тот блок, где исключение было инициировано, невозможен, поэтому управление передается во внешний блок.
    Схема передачи управления при возникновении исключения:

    Существует два типа исключений:

    • Системное исключение определяется в Oracle и обычно инициируется исполняемым ядром PL/SQL, обнаружившим ошибку. Одним системным исключениям присваиваются имена (например, NO_DATA_FOUND), другие ограничиваются номерами и описаниями.
    • Исключение, определяемое программистом, актуально только для конкретного приложения. Имя исключения можно связать с конкретной ошибкой Oracle с помощью директивы компилятора EXCEPTION_INIT или же назначить ошибке номер и описание процедурой RAISE_APPLICATION_ERROR.

    Исключения

    Исключение — это состояние ошибки, которое активизируется — или возбуждается — при возникновении некоторой проблемы. Существует много разных исключений, каждое из которых связано с определенным типом проблем. При возникновении исключительной ситуации выполнение кода останавливается на операторе, который возбудил исключение, и управление передается той части блока, которая обрабатывает это исключение. Если блок не содержит выполняемой секции, PL/SQL пытается найти выполняемую секцию во включающем базовом блоке (enclosing basic block), т.е. в блоке, который является внешним по отношению к коду, возбудившему исключение. Если в непосредственном включающем блоке отсутствует обработчикданного исключения, то поиск продолжается в блоках следующих уровней, пока не будет найден подходящий обработчик, а если его найти не удается, то выполнение программы прекращается с выдачей сообщения о необрабатываемой ошибке. Часть блока, предназначенная для обработки исключений, — это идеальное место для выдачи информативных сообщений об ошибках и выполнения очистки (cleanup), позволяющей избавиться от всего, что могло бы в дальнейшем вызвать путаницу или проблемы. Если исключение было возбуждено в ходе выполнения процедуры, вставляющей строки в таблицу, то типичная процедура очистки может включать в себя оператор ROLLBACK. После того как управление было передано обработчику исключения, оно уже не возвращается оператору, ставшему причиной этого исключения. Вместо этого управление передается оператору включающего базового блока, который следует сразу за вызовом вложенного блока или процедуры/функции.

    Системные исключения

    В PL/SQL можно выдавать пользователям информацию об ошибке двумя способами. Первый способ — использовать команду SQLCODE, которая возвращает код ошибки. Этот код представляет собой отрицательное число, обычно равное номеру ошибки ORA, которая выводится при завершении приложения, если исключение осталось необработанным. Второй способ — возвращать текстовое сообщение, описывающее ошибку. Неудивительно, что соответствующая команда называется SQLERRM. В обработчике исключения можно использовать как SQLCODE, так и SQLERRM. Замечание: не у всех системных исключений есть имена. Системные исключения:

    • CURSOR_ALREADY_OPEN — Попытка открыть уже открытый курсор;
    • DUP_VAL_ON_INDEX — Попытка вставить повторяющееся значение в столбец, имеющий уникальный индекс, а следовательно, ограничение уникальности;
    • INVALID_CURSOR — Попытка применить команду FETCH к неоткрытому курсору или попытка закрыть курсор, который не открывался;
    • NO_DATA_FOUND — Попытка выполнить SELECT INTO, когда SELECT возвращает нулевое количество строк, а также другие причины;
    • PROGRAM_ERROR — Внутренняя ошибка. Обычно означает, что вам нужно обратиться в службу поддержки Oracle;
    • STORAGE_ERROR — Программе не хватает системной памяти;
    • TIME_OUT_ON_RESOURCE — Программа слишком долго ожидала доступности некоторого ресурса;
    • TOO_MANY_ROWS — SELECT INTO в PL/SQL вернул более одной строки;
    • VALUE_ERROR — PL/SQL встретил неправильное преобразование или усечение данных, или неправильное ограничение на данные;
    • ZERO_DMDE — Попытка деления на нуль;
    • OTHERS — Все прочие исключения и внутренние ошибки, которые не охватываются исключениями, определенными в базовом блоке. Используется в тех случаях, когда вы точно не знаете, какое именованное исключение предстоит обрабатывать, и хотите обрабатывать любые возбуждаемые исключения.

    Исключения, определяемые программистом

    Одной из удобных возможностей PL/SQL является то, что он позволяет вам определять свои собственные исключения. При возбуждении и обработке они должны именоваться и объявляться аналогично любым другим элементам PL/SQL. Исключение объявляется в секции объявлений. Аналогично любой другой объявленной там переменной, исключение действительно только для данного блока. Вы можете использовать свои собственные исключения для обработки ошибок, которые система не обнаруживает или не считает за ошибки.

    Схема сложного запроса PL/SQL с использованием временных таблиц

    Ниже рассмотрена схема получения результирующей таблицы в Oracle Database, используя временные таблицы.

    oracle_fan

    Наверное, в мире не осталось программных продуктов, не содержащих ошибки. Особенно таких, которые богаты функционалом. А СУБД от корпорации Oracle функционалом даже переполнена. Соответственно, ошибок в работе этой СУБД тоже хоть отбавляй. Не так давно вышел кумулятивный набор заплаток 10.2.0.5. Он, вроде бы, ставится на СУБД любой версии в пределах ветки 10.2.
    Мы с коллегами даже попробовали поставить на одну из наших БД этот набор. Поставить-то он поставился, только вместо старых глюков мы получили новые. Пришлось даже делать SR (service request) в техподдержку Oracle. Долго они ковырялись с нашей проблемой. В конце концов наш же сотрудник и подсказал им (то есть ораклиной техподдержке) возможное решение, которое техподдержка и порекомендовала нам применить. Забавные в Оракле спецы работают, вобщем.

    Но заметка не только об этом. Я вот задумался. Как можно протестировать беспроблемную установку 10.2.0.5 на все версии СУБД, которые младше этого набора? У конечного же пользователя может быть и 10.2.0.1, и 10.2.0.2, и какие-то индивидуальные (специальные заплатки) и какие угодно PSU, CPU и прочая хрень. То есть, комбинаций из патчей, патчиков — море. И среди этих патчей, могут быть и такие, которые сами по себе глючные (такое бывает со всеми поставщиками программных продуктов: выпускаешь один патчик, а потом сразу же другой, который исправляет ошибки первого). А кроме того, в самой БД же могут быть установлены, а могут и нет, какие-либо компоненты (типа JAVA, XDB и прочего хлама, который зачем-то решили запхнуть именно в БД). Эти компоненты тоже ведь должны учитываться. А еще вспомним о том, что СУБД кроссплатформенна. И офигеваем от конечного количества возможных вариантов.

    Так вот, учитывая всё вышесказанное, как можно быть уверенным в том, что 10.2.0.5 (или любой другой накопительный набор) будет работать корректно? Понятно, что опытные пользователи, прежде чем ставить патч на рабочую БД, предварительно погоняют его на тестовой. Но всё равно, даже такое тестирование может не дать полной уверенности в работоспособности СУБД. Да, я знаю о том, что ставить сколь-либо "тяжелые" патчи желательно в отдельный каталог, предварительно установив туда базовую версию ПО. Да, я знаю, что многие патчи "теоретически" можно откатить. Да, я знаю, что есть, так называемые постепенные накатки патчей (rolling upgrades). Но даже при наличии таких вот технологических решений каждый раз при накатке очередного патча находишься в состоянии стресса. Особенно для тех баз данных, которые критичны для бизнеса. Ведь корпорация не даёт никаких гарантий, что всё будет работать должным образом.

    Еще от коллег узнал интересную информацию. Оказывается, что ошибки в работе СУБД, которые уже исправлены на одной платформе (например, под Линуксом), могут быть не исправлены под другой (АИКСом). То есть, патчик для СУБД под Линукс может существовать, а на СУБД под АИКС — нет. Офигеть!. Типа рациональный подход — раз клиент не жалуется, значит всё в порядке. Хотя у клиента и может возникнуть подобная ошибка, так мы её потом исправим — такой вот Ораклиный подход! На мой взгляд — это вообще ни в какие рамки не лезет. Я понимаю, что тестирование ошибок под разными платформами — это дополнительное время и, следовательно, деньги. Но ведь нельзя не отметить, что СУБД от Оракл — одна из самых дорогих в мире. Так за что же клиент платит? Такое ощущение, что за яхты Ларри Эллисона.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *