Markhot oracle что делает

Обновлено: 07.07.2024

«Мне нравится Oracle, но иногда он заставляет меня лезть на стену», — такими словами начал свой пост разработчик с сайта CodingToFreedom, который, мягко говоря, недоволен этой технологией и называет ее, вероятно в шутку, «чистым злом». Последней каплей стал момент, когда специалисту пришлось вести с программой «битвы эпических масштабов», в результате чего он потратил несколько месяцев на решение ошибок, устранение которых должно занимать не более пяти минут.

Вот почему автор недолюбливает Oracle.

Отсутствие подробностей об ошибке

Каждый, кто когда-либо работал с Oracle SQL, знает, как программа сообщает об ошибках. Уведомления вроде «Invalid SQL statement» или «Missing Right Paranthesis» неинформативны, особенно, если в них нет информации о номерах строк с ошибкой.

В моем представлении Oracle — это парень, который работает на компанию уже десять лет и даже не пытается выполнять свои обязанности как положено, он просто делает какой-то минимум, которого достаточно, чтобы его не уволили.

Уведомления от Oracle настолько же бесполезны, как если вы попросите у кого-то помощи и вас отправят искать решение в Google.

Это не самая сложная ошибка, но чтобы ее устранить нужно определить, почему недостаточно существующих привилегий, а также отладить всю программу. И все это делается для того, чтобы в конечном итоге выяснить, что проблема не в представлениях , а в последовательностях , используемых для увеличения ID столбца, которому нужны привилегии для пользователя.

Oracle не знает, что делает Oracle

Каждый раз, когда пользователь пытается задать программе вопрос, она отвечает как тот парень из магазина, которого вы можете случайно перепутать с продавцом-консультантом — «извините, но я здесь не работаю».

Oracle непоследователен

Посмотрите на этот код. Что вы видите?

Код_1

Кроме того, что это выглядит безобразно и является возможным источником SQL-инъекции , сначала может показаться, что это рабочий код, но это не так. Хотя, если скопировать его в редактор и запустить, он запустится. Почему? Проблема в точке с запятой в конце скрипта. Функция EXECUTE IMMEDIATE везде работает по-разному.

Файлы журнала могут убить ваш скрипт

Представьте, вы работает над кодом, который по всем правилам должен работать, но не работает. В отчаянии вы начинаете добавлять после каждого вызова функции логи, чтобы выяснить, где скрипт перестает работать (потому что, конечно, Oracle просто так вам об этом не скажет). Вы находите все баги и надеетесь, что теперь цикл пройдет без ошибок, но внезапно вы замечаете увеличение переменной счетчика. А затем он останавливается после 459-й итерации из примерно 900.

Как оказалось, Oracle настолько не любит предоставлять пользователям вывод логов, что сам оператор ведения логов может привести к сбою скрипта, когда внутренний буфер вывода логов будет переполнен. Эта ошибка стала последней каплей моего терпения. На отладку у меня ушло несколько часов, а решение этой ошибки было довольно-таки простым:

Код_2

Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .

* subquery unnesting
подзапрос разворачивается в основной запрос
Пример - Semi join. Преобразование in/exists в join
Oracle ищет строки в правой таблице до первого совпадения (очень быстро по индексу, если в левой таблице немного строк)

* join predicate pushdown
фильтр из внешнего запроса проталкивается ниже, чтобы раньше отфильтровать данные

* join factorization
повторяющаяся часть Union all выносится во внешний запрос, внутри Union all остается только различия

* star transforamtion
join измерений с фильтрами разворачивается в in фильтры
таким образом получаем rowid битмап индексов на каждой колонке, потом мержим битовые карты через and и таблица быстро фильтруется по этим rowid без выполнения соединения

* Table Expansion
На партицированной таблице можно отключить индексы на часто изменяющихся частях. Тогда oracle разобъем запрос на 2 части: full scan по партициям без индекса и index scan с индексом.
Без такого преобразования был бы только full scan.

* or expansion
or Запрос разворачивается Union all или or merge битмап индекса или inlist iterator
Каждая итерация concatenation становится сложней, т.к. нужно доплонительно отфильтровать записи, которые уже попали в предыдущий этап конкатенации
Включение конкатенации при index skip scan: +use_concat(OR_PREDICATES(1))

* matview rewrite
Перезапись части запроса данными matview, если совпадает текст

* px: join filter/bloom
bloom предфильтрация потока 2 по данным потока 1

* транзитивность constraint
к примеру есть функциональный constraint: col2 = trunc(col1, 'yyyy'). При фильтрации по col1 на таблицу будет наложен также и на col2


результрующий запрос после всех преобразований оптимизатора
dbms_sql2.expand_sql_text

Ручная трансформаиця 1 запроса в другой

Статистика

Хинт для задания статистики колонки
+COLUMN_STATS(DD, VN, scale, length=3 distinct=5 nulls=0 min=2 max=10)

статистика по использованию сегмента
запись, полное сканирование, лукап - это инфаормация используется для тепловых карт и автоархивации
Ассоциация статистики к функции
* статистика поумолчанию в селективности и стоимости * диманическая статистика в зависимости от входных параметров через ODCIStatsSelectivity Как описать promo_stats_ot подробней тут

Колонки-кандидаты для гистограммы
Это должен быть столбец часто используемый в where с оператором = (equality)
Статистика ипользования столбца в условиях фильтрации содержится в таблице SYS.COL_USAGE$
Дополнительное условие создание гистограммы - это наличие перекоса в числе строк группы при сборе статистики по числу уникальных значений.

Просмотр данных гистограммы Планируемое число строк = общее число строк таблицы * SUM(frequency подходящее под условие) / последнее endpoint_number
ENDPOINT_REPEAT_COUNT - это число повторений популярного значения в endpoint_actual_value
Если значение не попало в endpoint_actual_value, то число строк = общее число / число уникальных

Join cardinality по гистограмме
если столбец факта сильно перекошен, и этот стоблец используется в join с измерением, то оптимизатор будет использовать стандартный план: число строк факта / селективность измерения , что даст не верный результат
Для обхода можно скопировать гистограмму с перекошенного столбца на столбец с фильтром измерения, тогда оценка части измерения

= оценки части перекошенных данных

Определение селективности, если на обоих столбцах соединения есть гистограмма
* SUM(frequency ведущей гистограммы * frequency ведомой гистограммы) (по всем совпадающим значениям) * селективность фильтра ведущей таблицы
* если это frequency гистограмма и часть данных выпала, то по выпашей части будет дан приблизительный расчет на основе distinct

PLSQL

Автономная транзакция
начинает работать с begin, т.е. все select в declare работают в основной

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

plsql redefinition
возможность делать ревизии (несколько версий) пакета и переключать через alter session/system.
Т.е. возможно выкладка изменений без остановки работы пользователей.

Консистентность функций
sql функция возвращает данные на момент своего вызова, а не на момент старта основного запроса! (Документация)

Параллелизация pipeline функций

PLSQL коллекции

Varrays - обычный массив
не может быть пропусков, должно быть точно указан размер * .count == .last - число элементов всегда равно индексу последнего
* может быть столбцом в таблице

Hash table - Associative array над связанным списком
ключ ассоциативного массива: VARCHAR2 или PLS_INTEGER + можно использовать для O(1) обращения по ключу
+ так и для прохождения first-last
+ хранится в pga памяти
- нельзя использовать в sql

Nested tables
хранится в автогенерируемой системной таблице
аналогично Varrays индекс массива автогенерируем, таблица обходится через FIRST..LAST
можно удалять элементы в отличии от Varrays, тогда .count < .last

+ может использоваться в запросах
+ может быть колонкой в таблице
+ поддерживает множественные операции в plsql: SET/DISTINCT/NOT/IN
+ может использоваться в bulk операциях select, delete

Анализ производительности запросов

индекс - кандидат на удаление
если "db block changes" > "logical reads"/3 из DBA_HIST_SEG_STAT - т.е. запись превышает логические чтения в 3 раза

forall - в статистике (ash/awr)
будет выглядеть как одно выполнение (exec), но обработавшее N строк.

Выявление skew через oem monitor
* смотрим активность, что несмотря на параллельность db time

= time
* потом делаем монитор в разрезе plan_line - сразу будет видно на каком этапе плана
* потом на parallel будет видно какое parallel set выполнял большую часть работы
* зная plan_line и сервер переходим в статистику выполнения, выбираем из выпадающего списка наш сервер и смотрим нашу plan_line
** в actual rows увидим сколько строк было обработано (оцениваем с общим числом), тамже размер памяти будет

Пометка запроса для awr
dbms_workload_repository.add_colored_sql - запрос всегда будет попадать в awr , несмотря на его частоту и скорость

Чтение плана
Читать план правильно сверху вниз, как будто это стек вызов процедур
Например FILER вначале, вообще может выключить работу sql
Сверху спускаемся до самого глубокого листа и от него стэк разворачивается в обратную сторону

Монотонный рост значений в индексе
может раздуть ITL у индекса, т.к. ITL листа наследуюется при расщеплении блока

Долгий вызов plsql в запросе
функцию можно увидеть в секции projection тормозящей строки плана

Undo/redo при вставке
append - уменьшает undo
append+nologging - уменьшает и undo и redo
CTAS == insert + append

Параллельное последовательное чтение индекса
1 поток читает адреса в связанном списке, а другие потоки считывают сами данные из блоков + дофильтровывают

Result_cache
* есть хинты на
** заставить кэшировать системные объекты
** задать время жизни
* при активации кэша на таблице, нужно проверить что запросов на ней немного и они возвращают небольшое число строк (основное время тратится на запрос, а не на возвращение строк)
* есть блэк лист (или хинтом) - отключить для разовых
* один latch на весь result_cache, так что вставка/чтение блокирует всех остальных

Вставка игнорируя consraint, но с сохранением ошибок а потом смотреть ключи и текст ошибки:
SELECT * FROM EXCEPTIONS;
+IGNORE_ROW_ON_DUPKEY_INDEX - хинт заставляет игнорировать дубликаты ключа при вставке

Пометка блока горячим
dbms_shared_pool.markHot(hash, namespace) - Оракл делает несколько клонов "горячих" объектов в пуле, как следствие соревновательность между сессиями за эти объекты несколько снижается.

Оптимизация хранения

Создание not null поля с default
не создает блоки физически, а только помечает в словаре.
Только при следующих измнеениях обновляется это значение.

Index coalesce
перемещает пустоты в конец индекса, которые потом можно будет использовать при равномерном добавлении (размер индекса не уменьшеается, blvel тоже, индекс и таблица не блокируется)

Вставка в новую таблицу
будет идти медленней, чем в старую, но с truncate. Т.к. asm в новой постоянно выделяет место на диске, а в старой место выделено, просто смещено HWM

Вставка в длинную таблицу
При вставке в таблицу с более 255 колонок, все колонки кладутся в 1 блок
При update строка разбивается на 2 блока, т.к. обновлеяемое значение записывается в новом
Так что такие таблицы имеет смысл ребилдить периодически, для избавления от одноблочных чтений

Include Индекс
Подходи, когда можно все нужные столбцы включить в unique Индекс, чтобы исключить обращение к таблице заменяет 2 индекса: Но c3,c4 не могут использоваться для фильтрации, только для извлечения данных

Дополнительные параметры таблиц в Exadata
Attribute clustering
упорядочивание данных согласно какогото индекса - делается автоматически при вставке и может использоваться exadata софтом при отсечении данных
Zone map
группирует блоки таблицы по какому то столбцу и в zone-map записывает верхнее и нижнее значение конкретной части, что также может использоваться Exadata для отсечения данных
группировать можно по значениям другой таблицы, по join запросу
Отрицательная эффективность Exadata
Может быть двойное разжатие, если после разжатия в Exadata получился размер CU больше 1МБ, тогда в бд отсылается сжатый вариант и там разжимается повторно
Так что сильное сжатие может дать отрицательную эффективность при колоночном сжатии в Exadata.

Структура Lob
lob состоит из 2 частей:
* lob locator (индекс, указывающий на части lob - хранится непосредственно в таблице)
* lob value - само значение хранится отдельно от таблицы (если больше 4000 байт)

Партицирование

Системное партицирование
нет указания колонки при создании, нужно указывать конкретную партицию при вставке или выборке.

Reference partitions
т.е. в строках нет даты, она автоматом подтягивается по FK из заголовка и партицируется по ней
У такого способопа партицирования плохая производительность.

* IOT могут быть партицированы по range/hash
* object table - также можно пратицировать.
* nested table - партицируется аналогично родительской

Глобальные индексы
можно партицировать только по range и hash

INDEXING OFF|On
можно задать активность индексов на конкретной партиции (ora 12)
индекс при этом должен быть создан как INDEXING PARTIAL
при запросе на партиции без индекса и с ним, будет конкатенация (см. раздел трансформаций)

Тепловая карта партиций
на основании статистики использования партиций (DBA_HEAT_MAP_SEG_HISTOGRAM) можно включить компресию

Настройки бд

Виды репликаций
* Statement: передаются запросы
+ меньше места, т.к. один запрос может обновлять N строк
- недерменированность резальутата в разных средах (NOW(), RAND() и прочее)
* передаются изменения данных:
+ однозначность результата
- большие объем

Exadata 12.2
* кэширование temp в flash disk (раньше только физ. диски) - ускорение!
* smart scan на сжатых индексах (раньше не работало, только бд)
* lob до 4 кб смогут использоваться в smart scan (иначе на бд)

Особенности только в exadata
* возможно для избранных таблиц делать keep flash cache
* _serial_direct_read=true - читать минуя буферный кэш
( минус в том, что бы его выполнить, нужно сбросить все данные из кэша на диск, чтобы прямым чтением забрались последние данные )
* частые запросы не используют smartscan, по тому, что таблица целиком уходит в кэш
* для inmemory можно использовать flash cache exadata

Разные SQL алгоритмы

Пагинация на ключах
Чтобы быстро пагинировать и не допускать съезжание страниц (если данные на предыдущую страницу добавилась между переключениями), нужно запоминать ID последней записи на странице и при переходе на следующую фильтровать по ней.
Так не надо будет сортировать все сначала, а достаточно пройтись по индексу нужные N записей и остановиться.
start_of_group - нумерация групп по разрывам
lag(a, 1, a) over (order by b) start_of_group -> sum(start_of_group) over(order by a)
определение начала группы, потом нарастающий итог по группам, чтобы их пронумеровать

Забор таблицы частями без fullscan, индексов и партиций
Таблица можно забирать по экстентно:
1. Определяем диапазон блоков, которые входят в экcтент.
Сортируем экстенты таблицы (v_table) по rowid и набираем нужное число блоков (num_part) на основании размеров в bytes.
2. Получаем идеально ровные 3 части данных по 5.3ГБ: 3. Формируем диапазон rowid для забора:
Размеры пачек получаются с разным количеством строк, но равные по размеру в байтах. Это обеспечит идеальное равномерное копирование данных, без перекоса при передаче по сети.
Сверяемся с полной таблицей: 4. Каждый поток забирает свой диапазон rowid
+ каждый поток читает свои блоки, нет полных или повторных сканирований
+ не нужны партиции или индексы
+ идеальное равномерное распределние по объему в байтах
+ мгновенный доступ по идентификаторам блоков (быстрей индексов и лучше работает на больших диапазонах)
+ не нужно указывать при заборе: по какому полю, в каких границах. Все можно сделать автоматически.
- В полной мере можно использовать только для полных заборов таблиц или партиций.
Сверху можно наложить дополнительные фильтры, но это может дать сильные перекосы данных между потоками забора, т.к. неизвестно в каком из блоков лежит нужная часть данных.

Данный подход используется в Sqoop с включенной опцией OraOop. Этот же механизм забора можно реализовать в Spark, но вручную сформировав массив предикатов алгоритмом выше.

поиск одного пропуска
* математической формулой: ( max-min ) * ( max - min + 1 ) / 2 + (count + 1) * min - sum --

= квадрат разницы/2 + число элементов - сумма
* через minus / not exists с генеренной полной последовательность тоже будет быстро (2 FTS + antijoin/sort)
* если n возрастающее число, то можно так: (1 FTS, возможно сортировка для аналитики)
Вставка данных больше размера varchar
при вставке в varchar данных больше 4000, то он обрезается до максимума
если вставляется в середину, строка обрежется по месту вставки
partition join
Добавляет недостающие данные в факте по f.cust_id (не нужно самому генерить)
Округление через to int
Удаление из обновляемого представления возьмется таблица с максимальным ключом, которая однозначно определяем результат джойна
если у sku ключ из 2 полей, а planarriv из 3, то возьмется максимальный с 3 полями: planarriv


Выражение на месте join если расставить скобки:
DBMS_HS_PASSTHROUGH - Полное выполнение запроса на удаленной бд
пакет DBMS_HS_PASSTHROUGH для выполнения запросов по дблинку к другим бд (все выполняется на стороне источника)

Lorem ipsum dolor

В процессе поиска работ ы ч асто можно встретить такую вакансию, как разработчик Oracle. Для те х к то хоть немного интересуется программированием , компания Oracle будет на слуху , а потому эти люди с могут привести о ней несколько фактов. Но кто такой разработчик Oracle и что он делает? На эти и другие вопросы мы сегодня постараемся ответить.

Что такое Oracle

  • проектированием, производством и продажей программных и аппаратных продуктов;

  • финансированием и инвестированием IT-стартапов;

  • обучением;

  • консалтингом;

  • предоставлением хостинг-услуг;

  • разработкой и созданием инструментов для СУБД;

  • и др.

Кто такой разработчик Oracle и что он делает

  • когда говорят о разработчике, который работает в компании Oracle;

  • когда говорят о разработчике, которы й работает с продуктами компании Oracle.

Что делает разработчик Oracle, который работает в самой компании

  1. Тесты. Тесты проходят все: кто устраивается программистом или любым другим сотрудником. Тесты проходят онлайн , и состоят они из нескольких десятков разносторонних вопросов, которые затронут 4 основные сферы: ваши интеллектуальные способности, коммуникацию и работу в команде, основы программирования, практическое программирование. Тест должен выполн ять ся за определенное время.

  2. Техническое собеседование. Проводится онлайн или в офисе. На этом этапе вам нужно будет ответить на вопросы технического плана, затрагивающие область вашей будущей работы. Если вы устраиваетесь разработчиком, то на этом этапе вам нужно будет показать свои технические навыки.

  3. HR-собеседование. На этом собеседовании вас могут спросить чт о у годно: начиная от программирования и заканчивая рассказом о своей семье. Суть этого собеседования — выяснить , какой вы человек.

Что делает разработчик Oracle, который работает с продуктами компании

  • разрабатывает и поддерживает базы данных;

  • пишет SQL-запросы;

  • ищет и устраняет уязвимости в базах данных;

  • обслуживает сервер ы ;

  • собира ет и обрабатыва ет необходимую информацию из баз данных;

  • улучша ет систему хранения информации;

  • и др.

Заключение

Теперь вы точно знаете, кто такой и что делает разработчик Oracle , в каком бы контексте н и употреблялось это выражение. Как работа в компании Oracle, так и просто понимание ее инструментов — это отличный опыт и серьезный вклад в ваше резюм е д ля дальнейшего продвижения по карьерной лестнице.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Недавно я с удивлением обнаружил, что, оказывается, толковых туториалов по Oracle Application Express (он же APEX, он же апекс, но не путать с языком apex, который используется в Salesforce) в природе не существует.

Это не самая распространенная технология, конечно, но, тем не менее, довольно востребованная. Есть десятки блогов об апексе (англоязычные, в основном), пара тысяч вопросов на Stackoveflow, специальный раздел по апексу на официальных форумах оракла, сам апекс существует уже 15 лет и все время развивается. Я был уверен, что и хороших туториалов полно. Но нет!

Мне тут же пришла в голову гениальная мысль восполнить этот пробел.

Оглавление

Почему существующие туториалы — плохие

Я немного поясню, почему я считаю существующие туториалы плохими. Апекс — это не язык программирования, это такой очень высокоуровневый инструмент разработки, ближайшим идейным аналогом которого я бы назвал MS Access. Соответственно, большая часть разработки на апексе состоит из работы с веб-интерфесом этой среды: нажимания на кнопки, перехода по ссылкам, заполнение полей с названиями компоментов, выбора значений из списков и так далее. Что делает типовой туториал? Он показывает скриншоты этих самых экранов с подписями "нажмите туда-то". При этом сама IDE достаточно удобная и понятная, почти все элементы снабжены справочными пояснениями, есть встроенная помощь. В итоге, если нужно объяснить пользователю, как создать приложение, в туториале будет большой скриншот, объясняющий, как нажать на кнопку "Create a new app". Вот, посмотрите сами на официальный оракловый туториал:

Скриншот примера туториала по апексу

Они бы еще объяснили со скриншотами, что "клик" — это однократное нажатие на левую кнопку манипулятора типа "мышь".
Конечно, полезная информация в таких туториалах тоже есть, но ее там крохи. Процентов на 80 туториалы состоят из таких вот скриншотов, причем по своему опыту я могу сказать, что человек, не читавший никаких туториалов вообще, самостоятельно найдет, как создать приложение, добавить страницу, поместить на нее отчет и так далее. А потом ему нужно будет организовать более-менее нетривиальное взаимодействие нескольких элементов апекса, и оказывается, что этот вопрос туториалом почти не покрывается. Приведу аналогию: вы только-только учитесь программировать, изучили переменные, массивы, циклы, условия, и получили задание, в рамках выполнения которого вам нужно отсортировать массив. Как-то отсорировать массив — достаточно просто, но как только задание усложнится до "отсортировать большой массив быстро", окажется, что имеющихся у вас знаний недостаточно. Погуглив, покопав Stackoverflow и форумы, вы найдете алгоритм быстрой сортировки. Конечно, кто-то и сам переизобретет этот алгоритм рано или поздно, но более эффективным путем было бы сразу прочитать книжку с разбором типовых алгоритмов. И вот как раз такого набора "типовых алгоритмов" для апекса обычно нигде нет, а на помощь приходят те же самые метод научного тыка, поисковики, форумы и Stackoverflow (и, я надеюсь, этот туториал).

Вводная информация

Предполагается, что читатель знаком с Oracle Database версии хотя бы с 11-й, SQL, PL/SQL и особенно с тем, что такое EXECUTE IMMEDIATE и как оно работает.

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

Обзор IDE

Стартовый экран, который вы увидите сразу после входа в IDE:

Главные элементы здесь — это 4 большие кликабельные картинки:

  1. "App Builder": это, собственно, то место, где можно создавать приложения и где вы будете проводить до 99% времени.
  2. "SQL Workshop": заменитель обычной IDE для работы с СУБД Oracle. Там вы можете посмотреть объекты БД (таблицы, индексы, пакеты, и т. п.) и выполнять SQL-запросы. Если у вас есть возможность делать все это через "обычные" IDE (вроде Oracle SQL Developer или PL/SQL Developer) — делайте через них. Тем не менее, этот раздел тоже может быть полезен и о нем я тоже расскажу.
  3. "Team Development": инструменты для командной разработки. Честно говоря, я ни разу не видел, чтобы хоть кто-то ими пользовался на практике (включая меня). Любопытства ради я туда тоже заглядывал и совсем бесполезным этот раздел я бы не назвал, хотя и очень хочется.
  4. "App Gallery": раздел с демо-приложениями. К тому моменту, когда он появился, я уже неплохо знал апекс и почти не заглядывал туда, но начинающим, думаю, это будет полезно. Там много разных простеньких приложений, на их примере можно изучать, как использовать те или иные возможности.

В меню в самом верху страницы продублированы эти же 4 пункта.

Кроме этого, есть еще несколько малополезных вещей: ниже есть некоторое количество статистической информации (типа наиболее часто редактируемых приложений или наиболее активных разработчиков). И есть колонка справа, где также немного статистики и дополнительных ссылок.

Рассмотрим App Builder и SQL Workshop подробнее.

App builder

Эта страница выглядит примерно вот так:


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

  1. "Create": создать новое приложение. Эта же функция продублирована чуть ниже (синяя кнопка "Create" над отчетом со списком приложений). Кнопка запускает мастер создания приложений.
  2. "Import": импортировать приложение. Апекс позволяет переносить приложения с одного сервера на другой в виде текстовых файлов (которые, по сути, являются длииииными PL/SQL скриптами с вызовами функций создания всех элементов приложения).
  3. "Dashboard": малополезное сборище статистики разработки приложений. Кто, когда, где, сколько изменений сделал. Думаю, даже вашему начальнику будет неинтересно туда смотреть.
  4. "Workspace Utilities": набор дополнительных инструментов для управления приложением. Честно говоря, туда я тоже почти не заглядываю.

Так же хочу обратить ваше внимание на вот такую маленькую кнопочку в панели отчета:

Переключатель вида отчета

Она переключает вид отчета с такого, как на скриншоте выше (с "картинками" приложений) на отчет в виде таблицы:

App builder в Oracle APEX

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

После того, как вы создадите приложение или откроете существующее, вы увидите следующую страницу (очень похожую на предыдущую по структуре):

На эту страницу вы будете заходить очень часто, и полезных функций здесь тоже очень много. Большие кнопки с картинками:

  1. "Run Application": эта кнопка запускает ваше приложение. Оно откроется в отдельном окне. По умолчанию — именно в окне, а не во вкладке браузера, но это поведение настраивается (об этом позже).
  2. "Supporting Objects": этот раздел служит для решения вопросов, связанных с установкой, обновлением и удалением приложений. Обычно им почти не пользуются.
  3. "Shared Components": я бы сказал, это первый или второй по важности раздел IDE (еще один — редактор страниц). Если вы будете много разрабатывать на апексе, то очень скоро заметите, что выучили структуру этого раздела как "Отче наш".
  4. "Utilities": еще один набор (мало)полезных вспомогательных функций.
  5. "Export / Import": позволяет экспортировать или импортировать приложения или отдельные части приложения.

И две дополнительные кнопки, которые обведены оранжевой рамкой на скриншоте:

  1. Кнопка "Edit application properties". Нажав на нее, вы попадете на страницу настроек свойств приложения. Возможно, вы не будете заходить в этот раздел часто, но он очень важен, потому что там хранятся настройки приложения, от которых много чего зависит. Далее, если я буду упоминать где-то "свойства приложения" — ищите их в этом разделе.
  2. В кои-то веки полезная функция в правой панели: "Delete this Application". В то время как многие функции в апексе продублированы в разных местах, эта функция есть только здесь, и с непривычки первый раз ее найти сложно.
Application properties

Здесь прежде всего интересна организация доступа к большому количеству настроек.

Application properties

Настройки сгруппированы в 4 группы (см. верхнюю рамку), а в каждой группе есть еще по нескольку подгрупп (см. нижнюю рамку), у каждой группы есть свое название. Похожим образом настройки организованы в очень многих местах в апексе. В дальнейшем я буду просто указывать путь к нужной настройке примерно так: "Application Properties" → "Definition" → "Name" → "Version".

Также, если вы посмотрите на хлебные крошки вверху страницы, вы увидите, что там написано "Edit Application Definition", хотя заходили вы, казалось бы, в "Application Properties". Просто не обращайте внимания.

Shared Components

Shared Components — это наше всё. Этот раздел является промежуточным пунктом на пути к конкретным компонентам приложений. Покажу здесь общий вид, просто чтобы вы представляли, где что находится:

Shared Components

Совсем неважной ерунды здесь почти нет. Каждый раздел вам так или иначе может понадобиться. Названия разделов говорят сами за себя, добавить почти нечего:

  1. "Application Logic": средства управления логикой приложения.
  2. "Security": вопросы безопасности и управления доступом к приложению целиком и к отдельным компонентам в зависимости от ролей пользователей.
  3. "Other Components": это "все остальные компоненты". По-хорошему, этому разделу следовало бы быть последним, но он почему-то здесь. А подпункт "List of Values" я бы вообще в Application Logic перенес.
  4. "Navigation": компоненты приложения для обеспечения навигации.
  5. "User Interface": настройка внешнего вида приложения, стилей и т. п.
  6. "Files": раздел для файлов (например, css или js). Незаменим, если у вас нет доступа к ОС, и все равно удобен, даже если доступ есть.
  7. "Data Sources": работа с источниками данных (для загрузки и выгрузки).
  8. "Reports": отчеты, очевидно.
  9. "Globalization": раздел для перевода приложений на другие языки.

Перевод приложений в апексе сделан просто ужасно (честно, я пытался придумать, как сделать его хуже — и не смог), и нет никаких свидетельств того, что в будущем станет лучше.
Ужасно с точки зрения архитектуры и удобства работы над переводом. Могу только сказать разработчикам: "Спасибо, что хотя бы без багов" (но тут как посмотреть: переводы устроены так, что некоторые особенности их работы мало чем отличаются от багов).
Приходится с этим жить.

Page Designer

Page Designer — редактор страниц. Это, наверное, главное место в IDE. Здесь вы будете создавать то, с чем напрямую взаимодействует пользователь, — страницы приложения. Здесь просто куча функций, почти как в кабине самолета. Чтобы попасть в Page Designer, нужно кликнуть по ссылке с названием страницы на странице приложения (извините за тавтологию). На скриншоте разноцветными рамками выделены основные составляющие редактора:

Page Designer

Панель кнопок вверху (в красной рамке):

  • Поле для ввода номера страницы, стрелки вверх и вниз и кнопка "Go": навигация по страницам приложения. Каждая страница имеет номер, тут вы можете либо ввести номер нужной страницы, либо стрелками перейти к следующей/предыдущей, либо нажать на самую левую кнопку и в появившемся модальном окне выбрать страницу из списка.
  • Кнопка с замком: позволяет заблокировать страницу от изменений другими разработчиками.
  • Кнопки Undo/Redo
  • Две кнопки с доступом к вспомогательным функциям.
  • Кнопка-ссылка на Shared Components. Полезная, потому что туда-сюда ходить приходится постоянно. (Я сам, правда, предпочитаю просто держать Shared Components в отдельной вкладке — так еще быстрее).
  • Кнопка "Save": сохраняет изменения на странице.
  • Кнопка "Run": "запускает" страницу, то есть вы ее видите так, как ее потом увидит пользователь.

Слева (в оранжевой рамке) — панель с компонентами страницы. В этой панели есть 4 закладки:

  • "Rendering": показывает, из каких составных частей состоит страница, какие процессы выполняются при рендеринге;
  • "Dynamic Actions": действия, выполняемые на клиенте (например, обработчики событий javascript);
  • "Processing": серверные процессы, связанные со страницей;
  • "Page Shared Components": для прямого перехода к используемым на странице общим компонентам (те самые Shared Components).

По центру (в зеленой рамке) — панель, содержащая много разнородной информации. В верхней части панели есть 5 закладок, на которых можно найти:

Также центральная панель имеет снизу еще одну дополнительную панель, которую можно использовать для быстрого добавления компонентов на страницу.

Справа (в синей рамке) — панель свойств. Тут все просто — она показывает свойства выбранного в данный момент компонента. Часть свойств компонентов — простые: текст, число, значение из списка. Но у более сложных свойств компонентов есть дополнительные интерфейсные возможности, сильно облегчающие жизнь при работе с ними.
Свойство, представляющее собой большой текст. Например, код на PL/SQL или JavaScript. Выглядит так:

Memo property screenshot

Можно писать код прямо так, в этом поле, а можно щелкнуть по кнопке вверху страва, и тогда откроется модальное окно с редактором кода, где доступны подсветка синтаксиса (для SQL, JavaScript, CSS, HTML), поиск в тексте и другие функции редактора.

Свойство — Shared Component. Если свойство является одним из компонентов приложения (Shared Component), то выбирать конкретный компонент можно из списка, а нажав на кнопку справа от списка

Go to Shared Components button

можно переместиться в раздел Shared Components непосредственно в свойства выбранного компонента (чтобы, например, их изменить).

Если у вас значение свойства выбирается из списка, иногда справа можно увидеть другую дополнительную кнопку:

quick pick

Она называется "Quick pick" и используется, когда вариантов очень много. "Quick pick" дает чуть более быстрый доступ к небольшому подмножеству вариантов — как правило, там находятся наиболее часто используемые варианты. "Часто используемые варианты" здесь — не вами используемые, а "вообще". Это жестко заданный список и со временем не меняется.

SQL Workshop

Как я уже говорил, SQL Workshop — это заменитель обычной IDE (если у вас по каким-то причинам нет возможности ее использовать).

SQL Workshop

Он состоит из 5 разделов:

  1. "Object Browser": браузер объектов БД (таблиц, пакетов, функций и процедур, индексов, сиквенсов и прочего);
  2. "SQL Commands": раздел, где можно выполнить любой SQL запрос или PL/SQL код;
  3. "SQL Scripts": здесь можно загрузить текстовый файл со скриптом и выполнить его;
  4. "Utilities": разные дополнительные возможности, связанные с БД: например, есть графический построитель запросов (но не только);
  5. "RESTful Services": создание REST сервисов. Апекс тоже имеет REST (причем давно, еще в версии 4.2 они уже были)!
Object Browser

Object Browser

Здесь есть все, что нужно для работы с объектами БД: создание, изменение, удаление, просмотр свойств объектов, ввод данных в таблицы — для всего этого в этом разделе есть графический интерфейс. Вверху слева в выпадающем списке можно выбрать тип объектов (на скриншоте показаны таблицы), вверху справа можно выбрать схему, объекты которой вы можете посмотреть. В списке доступных схем вы не увидите все схемы сразу — это нормально. Как сделать схемы видимыми в апексе, я расскажу, когда дойду до администрирования.
Также я не вижу большого смысла описывать этот раздел подробнее: если вы знаете, что значит фраза "добавить столбец в таблицу", вы без труда догадаетесь, когда вам нужно будет нажимать на кнопку "Add Column" и что вас может ждать дальше.

SQL Commands

В этом разделе можно выполнять SQL запросы и PL/SQL код.

SQL Commands

По возможностям этот раздел почти не уступает полноценным средам разработки. Не хватает разве что автодополнения кода и подсветки синтаксиса (а в Object Browser подсветка синтаксиса есть, кстати). Имеющиеся возможности:

  • выполнение SQL, в том числе с параметрами (для ввода значений параметров появится отдельное окно);
  • выполнение PL/SQL с возможностью вывода текста через dbms_output (вывод появится в окне ниже);
  • выполнение только выделенной части кода (выделить текст мышкой, затем "Run");
  • просмотр плана запроса;
  • сохранение запросов.

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

P. S. Я пока не могу сказать, что четко продумал структуру этого туториала, возможно, в будущем я добавлю еще скриншоты и описания в эту статью или опишу дополнительные возможности в других статьях. Осталось придумать, как оповещать заинтересованных о значительных правках старых статей.

Читайте также: