Том Кайт (Tom Kyte)
Томас Кайт - американский специалист в IT, вице-президент Oracle (работал в ней с 1993 г), старший архитектор отдела серверных технологий. Известен как эксперт в области разработки приложений для СУБД Oracle. Автор журнала Oracle Magazine и нескольких бестселлеров по Oracle Database. Самые известные:
- Effective Oracle by Design (Эффективное проектирование приложений Oracle)
- Expert One on One Oracle (Oracle для профессионалов в 2-х томах)
и др.
Рекомендую к прочтению.
Он ведущий популярного сайта AskTom («Спроси у Тома»), посвященного проблемам и методам их решений в Oracle Database. Его сайт содержит тонны вопросов, порой достаточно заковыристых и, самое главное, ответы на них.
У вас есть какой-то вопрос или вы чего-то не понимаете? Прямая дорога на этот сайт.
Я иногда буду публиковать в нашем телеграм-канале, посты с его сайта. Вероятно, это поможет вам в вашей профессиональной деятельности 📚
#asktom
Томас Кайт - американский специалист в IT, вице-президент Oracle (работал в ней с 1993 г), старший архитектор отдела серверных технологий. Известен как эксперт в области разработки приложений для СУБД Oracle. Автор журнала Oracle Magazine и нескольких бестселлеров по Oracle Database. Самые известные:
- Effective Oracle by Design (Эффективное проектирование приложений Oracle)
- Expert One on One Oracle (Oracle для профессионалов в 2-х томах)
и др.
Рекомендую к прочтению.
Том Кайт - человек-легенда в мире Oracle.
Почему я вдруг про него написал?Он ведущий популярного сайта AskTom («Спроси у Тома»), посвященного проблемам и методам их решений в Oracle Database. Его сайт содержит тонны вопросов, порой достаточно заковыристых и, самое главное, ответы на них.
У вас есть какой-то вопрос или вы чего-то не понимаете? Прямая дорога на этот сайт.
Я иногда буду публиковать в нашем телеграм-канале, посты с его сайта. Вероятно, это поможет вам в вашей профессиональной деятельности 📚
#asktom
You Asked
Мне нужно экспортировать данные из таблицы в файл .csv.
Заголовки моих столбцов должны быть между "". Данные с разделителем ",".
Также в зависимости от значений столбца строка может быть напечатана до 5 раз с данными, отличающимися только в одном поле.
А еще, мне нужно запускать эту программу ежедневно.
and we said...
1. Используйте пакет utl_file для выгрузки данных.
2. Используйте джобы/расписания для периодичности выполнения задания.
Подробности в статье Тома
#csv #plsql #asktom
Мне нужно экспортировать данные из таблицы в файл .csv.
Заголовки моих столбцов должны быть между "". Данные с разделителем ",".
Также в зависимости от значений столбца строка может быть напечатана до 5 раз с данными, отличающимися только в одном поле.
А еще, мне нужно запускать эту программу ежедневно.
and we said...
1. Используйте пакет utl_file для выгрузки данных.
2. Используйте джобы/расписания для периодичности выполнения задания.
Подробности в статье Тома
#csv #plsql #asktom
You Asked
Пожалуйста, подскажите решение по конвертации из CLOB в VARCHAR2.
Все что я нашел это преобразование BLOB в VARCHAR2, и когда я пытаюсь применить примеры к CLOB, получаю ошибки.
and we said...
Используйте:
#asktom #clob #varchar2
Пожалуйста, подскажите решение по конвертации из CLOB в VARCHAR2.
Все что я нашел это преобразование BLOB в VARCHAR2, и когда я пытаюсь применить примеры к CLOB, получаю ошибки.
and we said...
Используйте:
dbms_lob.substr( clob_column, for_how_many_bytes, from_which_byte );Например:
select dbms_lob.substr( x, 4000, 1 ) from T;Подробности в статье Тома
#asktom #clob #varchar2
You Asked
Как получить DDL скрипт партиционированной таблицы и индексов в Oracle?
and we said...
Используйте IDE, например, SQL Developer.
Или функцию dbms_metadata.get_ddl.
Например:
#asktom #dbms_metadata
Как получить DDL скрипт партиционированной таблицы и индексов в Oracle?
and we said...
Используйте IDE, например, SQL Developer.
Или функцию dbms_metadata.get_ddl.
Например:
select dbms_metadata.get_ddl(object_type => 'TABLE', name => 'MYTAB') ddlПодробности в статье Тома
from dual;
#asktom #dbms_metadata
Ошибка в PL/SQL на разных языках
You asked…
Необходимо чтобы наше приложение на PL/SQL возбуждало исключения на разных языках в зависимости от настроек NLS.
...and we said
Команда Тома Кайта предлагает следующее решение:
1. Создать пользовательскую процедуру raise_application_error_i18n
2. Создать таблицу с кодами ошибок, языками и соответствующими сообщениями.
3. При вызове функции raise_application_error_i18n с определенным кодом, получать текущие настройки NLS и искать в этой таблице сообщение об ошибке.
4. Далее через обычное пользовательское исключение raise_application_error возбуждать ошибку с переданным кодом и найденным в таблице сообщением.
Подробности в статье Тома.
#asktom
You asked…
Необходимо чтобы наше приложение на PL/SQL возбуждало исключения на разных языках в зависимости от настроек NLS.
...and we said
Команда Тома Кайта предлагает следующее решение:
1. Создать пользовательскую процедуру raise_application_error_i18n
2. Создать таблицу с кодами ошибок, языками и соответствующими сообщениями.
3. При вызове функции raise_application_error_i18n с определенным кодом, получать текущие настройки NLS и искать в этой таблице сообщение об ошибке.
4. Далее через обычное пользовательское исключение raise_application_error возбуждать ошибку с переданным кодом и найденным в таблице сообщением.
Подробности в статье Тома.
#asktom
You asked…
У меня есть Master-таблица с автогенерируемым PK. Я создал процедуру, в которой делаю INSERT в мастер таблицу, получаю в ней сгенерированный ID (PK).
Далее использую его для вставки в child-таблицы.
Таких таблиц у меня много.
1) Является ли это хорошей практикой, использовать процедуры для выполнения вставки?
2) Нужно ли создавать для каждой таблицы обертку в виде процедуры?
...and we said
Если кратко. То это хороший принцип построения архитектуры. В статье Тома, есть ссылка на другую статью "SmartDb\ThickDB" раскрывающую принцип модульности, интерфейсов, сокрытия реализации. Рекомендую изучить.
Подробности в статье Тома.
От себя добавлю. В наших проектах, мы стараемся делать низкоуровневые API для работы с физическими объектами. Бизнес-логика при этом реализуется на среднем слое.
Конечно, не в каждом проекте это применимо. Например, кто-то использует ORM для работы с БД.
#asktom #архитектура
У меня есть Master-таблица с автогенерируемым PK. Я создал процедуру, в которой делаю INSERT в мастер таблицу, получаю в ней сгенерированный ID (PK).
Далее использую его для вставки в child-таблицы.
Таких таблиц у меня много.
1) Является ли это хорошей практикой, использовать процедуры для выполнения вставки?
2) Нужно ли создавать для каждой таблицы обертку в виде процедуры?
...and we said
Если кратко. То это хороший принцип построения архитектуры. В статье Тома, есть ссылка на другую статью "SmartDb\ThickDB" раскрывающую принцип модульности, интерфейсов, сокрытия реализации. Рекомендую изучить.
Подробности в статье Тома.
От себя добавлю. В наших проектах, мы стараемся делать низкоуровневые API для работы с физическими объектами. Бизнес-логика при этом реализуется на среднем слое.
Конечно, не в каждом проекте это применимо. Например, кто-то использует ORM для работы с БД.
#asktom #архитектура
You asked…
У меня вопрос по поводу Varray (это один из типов коллекций в Oracle).
Зачем именно они нам нужны? Можете ли вы привести пример их использования?
Было бы интересно узнать ваше мнение.
...and we said
Я никогда их не использую. Я использую nested tables в PL/SQL-коде.
Также, никогда не использую коллекции в качестве столбцов физических таблиц.
Varray лимитированы размером и их не очень удобно использовать в коде.
Подробности в статье Тома
⚠️ От себя добавлю. В реальной жизни, кроме как на собеседованиях тип Varray мне не встречался. Использовать в качестве типа столбца таблицы - является плохим тоном по разным причинам. В PL/SQL-коде nested tables хватает более чем.
#asktom #коллекции #varray
У меня вопрос по поводу Varray (это один из типов коллекций в Oracle).
Зачем именно они нам нужны? Можете ли вы привести пример их использования?
Было бы интересно узнать ваше мнение.
...and we said
Я никогда их не использую. Я использую nested tables в PL/SQL-коде.
Также, никогда не использую коллекции в качестве столбцов физических таблиц.
Varray лимитированы размером и их не очень удобно использовать в коде.
Подробности в статье Тома
⚠️ От себя добавлю. В реальной жизни, кроме как на собеседованиях тип Varray мне не встречался. Использовать в качестве типа столбца таблицы - является плохим тоном по разным причинам. В PL/SQL-коде nested tables хватает более чем.
#asktom #коллекции #varray
Длинный список в условии IN
You asked…
Сколько элементов может быть в списке WHERE x IN (,,,)?
Я придумал два способа обхода:
1. Динамически формировать список через OR.
...and we said
Лимит элементов в конструкции IN - 1000.
ORA-01795: maximum number of expressions in a list is 1000
Первый способ, не стоит использовать, т.к. будет порождать лишние запросы в кэше, будут hard parse и т.д.
Второй способ, плох тем, что вы каждый раз выполняете DDL при создании таблицы. Это дорогая операция.
Решение: использовать временные таблицы. Они создаются один раз, но заполнять их можно в соответствии с вашими требованиями.
#asktom #временныетаблицы
You asked…
Сколько элементов может быть в списке WHERE x IN (,,,)?
Я придумал два способа обхода:
1. Динамически формировать список через OR.
x = el_1 OR x = el_2 OR x = el_3 OR …2. Динамически создавать таблицу, заполнять её элементами и использовать в условии where, но создание таблицы может занимать до 15 секунд.
...and we said
Лимит элементов в конструкции IN - 1000.
ORA-01795: maximum number of expressions in a list is 1000
Первый способ, не стоит использовать, т.к. будет порождать лишние запросы в кэше, будут hard parse и т.д.
Второй способ, плох тем, что вы каждый раз выполняете DDL при создании таблицы. Это дорогая операция.
Решение: использовать временные таблицы. Они создаются один раз, но заполнять их можно в соответствии с вашими требованиями.
insert into GTT_TAB values ( ... );Подробности в статье Тома
select * from T where (a,b) in (select x,y from temp);
#asktom #временныетаблицы
Вызов внешнего RestAPI
You asked…
Мне необходимо вызывать внешний Rest-сервис. Как это лучше всего организовать? Приведите, пожалуйста, пример.
...and we said
Если вам необходимо вызывать из базы данных внешние сервисы необходимо:
1. Настроить доступ из БД через ACL по определенному адресу/порту.
2. Затем используя пакет utl_http организовать логику работы с внешним сервисом.
Пример такой организации вы можете посмотреть по ссылкам в статье.
Подробности в статье Тома
---
От себя добавлю. Это решение подходит для систем построенных на серверной логике. Если же у вас трехзвенная архитектура со средним слоем на Java-приложении (например), то лучшее решение - организовать запросы во внешние сервисы именно там.
#asktom #restapi #acl #utl_http
You asked…
Мне необходимо вызывать внешний Rest-сервис. Как это лучше всего организовать? Приведите, пожалуйста, пример.
...and we said
Если вам необходимо вызывать из базы данных внешние сервисы необходимо:
1. Настроить доступ из БД через ACL по определенному адресу/порту.
2. Затем используя пакет utl_http организовать логику работы с внешним сервисом.
Пример такой организации вы можете посмотреть по ссылкам в статье.
Подробности в статье Тома
---
От себя добавлю. Это решение подходит для систем построенных на серверной логике. Если же у вас трехзвенная архитектура со средним слоем на Java-приложении (например), то лучшее решение - организовать запросы во внешние сервисы именно там.
#asktom #restapi #acl #utl_http
Соглашение об именовании (naming convention)
You asked…
Привет, Том!
Хотел бы узнать вашу точку зрения на соглашение об именах?
Например, вы ограничиваете количество символов (скажем, 20) для имени таблицы?
Предоставляет ли Oracle шаблон для соглашения об именах в базе данных?
...and we said
Лично у меня нет соглашений об именах. Я не люблю набирать действительно длинные имена, но время от времени я достигаю ограничения в 30 символов.
Это, прежде всего, вопрос выбора команды.
Единственные соглашения об именах, которые у меня есть, относятся к PLSQL.
Локальные переменные должны начинаться с L_
Параметры должны начинаться с P_
Глобальные переменные пакета должны начинаться с G_
Например, параметр ENAME не будет путаться со столбцом с именем ENAME в запросе - у меня никогда не будет столбца p_ename - поэтому нет двусмысленности.
Подробности в статье Тома
#asktom #именование
You asked…
Привет, Том!
Хотел бы узнать вашу точку зрения на соглашение об именах?
Например, вы ограничиваете количество символов (скажем, 20) для имени таблицы?
Предоставляет ли Oracle шаблон для соглашения об именах в базе данных?
...and we said
Лично у меня нет соглашений об именах. Я не люблю набирать действительно длинные имена, но время от времени я достигаю ограничения в 30 символов.
Это, прежде всего, вопрос выбора команды.
Единственные соглашения об именах, которые у меня есть, относятся к PLSQL.
Локальные переменные должны начинаться с L_
Параметры должны начинаться с P_
Глобальные переменные пакета должны начинаться с G_
Например, параметр ENAME не будет путаться со столбцом с именем ENAME в запросе - у меня никогда не будет столбца p_ename - поэтому нет двусмысленности.
Подробности в статье Тома
#asktom #именование
В чем разница между потенциальным планом и планом выполнения
You asked…
Привет, Том!
Привет, у меня вопрос по поводу потенциального и реального плана. Я читал, что план выполнения - это план, который Oracle намеревается использовать для запроса, и фактический план выполнения может отличаться; если это так, то как мне получить реальный план выполнения. Заранее спасибо.
...and we said
Представьте, что вы планируете автопутешествие. Вы открываете навигатор и строите маршрут. Это ваш гипотетический план.
Пришел день выезда. Вы садитесь за руль, включаете радио и слышите, что по вашему маршруту произошла крупная авария. Вы не хотите сидеть в многочасовой пробке. Вы открываете навигатор и строите маршрут заново. Затем вы едите по новому маршруту. Это и есть ваш реальный план маршрута.
Гипотетический план - это предсказание.
Фактический план - это то как реально все прошло.
Существует множество способов получить план выполнения. Ссылки в статье.
Подробности в статье Тома.
#asktom #оптимизация
You asked…
Привет, Том!
Привет, у меня вопрос по поводу потенциального и реального плана. Я читал, что план выполнения - это план, который Oracle намеревается использовать для запроса, и фактический план выполнения может отличаться; если это так, то как мне получить реальный план выполнения. Заранее спасибо.
...and we said
Представьте, что вы планируете автопутешествие. Вы открываете навигатор и строите маршрут. Это ваш гипотетический план.
Пришел день выезда. Вы садитесь за руль, включаете радио и слышите, что по вашему маршруту произошла крупная авария. Вы не хотите сидеть в многочасовой пробке. Вы открываете навигатор и строите маршрут заново. Затем вы едите по новому маршруту. Это и есть ваш реальный план маршрута.
Гипотетический план - это предсказание.
Фактический план - это то как реально все прошло.
Существует множество способов получить план выполнения. Ссылки в статье.
Подробности в статье Тома.
#asktom #оптимизация
Условная компиляция в запросах
You asked…
Привет, Том!
Я пытаюсь использовать условную компиляцию в запросе для курсора в процедуре.
При компиляции не получаю ошибок. Я получаю две колонки в курсоре, но ожидаю три, т.к. передаю входной параметр, который должен выбирать какой курсор отдавать. И должно быть три колонки. Пожалуйста, подскажи, что я не так делаю.
...and we said
Подсказка в названии. Вы используете условную компиляцию. И уже на этапе компиляции отсекается код, который не соответствует условию. Если вы хотите изменить поведение скомпилированного кода, вам необходимо изменить условия и заново его скомпилировать. С учетом этого, в run-time изменить поведение процедуры не получится.
Если вы все таки хотите добиться получения разных курсоров, то вам необходимо использовать динамический SQL в процедуре.
Подробности в статье Тома.
#asktom #компиляция
You asked…
Привет, Том!
Я пытаюсь использовать условную компиляцию в запросе для курсора в процедуре.
При компиляции не получаю ошибок. Я получаю две колонки в курсоре, но ожидаю три, т.к. передаю входной параметр, который должен выбирать какой курсор отдавать. И должно быть три колонки. Пожалуйста, подскажи, что я не так делаю.
...and we said
Подсказка в названии. Вы используете условную компиляцию. И уже на этапе компиляции отсекается код, который не соответствует условию. Если вы хотите изменить поведение скомпилированного кода, вам необходимо изменить условия и заново его скомпилировать. С учетом этого, в run-time изменить поведение процедуры не получится.
Если вы все таки хотите добиться получения разных курсоров, то вам необходимо использовать динамический SQL в процедуре.
Подробности в статье Тома.
#asktom #компиляция
🌐 Навигация по темам канала Oracle Developer
📘 Основы
#sql #plsql #теория #архитектура
#функции #секционирование #временныетаблицы
#транзакции #исключения #курсоры
#аналитическиефункции #иерархическиезапросы
#системныепредставления #компиляция #представления #коллекции #циклы
🛠 Практика и задачи
#задача #решениезадачи #asktom
🚀 Оптимизация и производительность
#оптимизация #nestedloops #индекс
🧩 Инструменты и технологии
#тестирование #postgresql #oracle #docker #oracle23c #ide #ai
💼 Карьера и Развитие
#карьера #собеседование #hr #тинькофф #magnit #вкусноиточка #leroymerlin #сбер #яндекс #Эффективность #КарьерныйРост #Denis_Kivillev #Работа
🎓 Дополнительные материалы
#видео #подкаст #аудиоподкаст #конкурс #марафон #юмор
—
В почти 700 (!) постах не мудрено заплутать. Поэтому решил сделать подобие навигации 😉
Не забывайте пользоваться обычным поиском, я не добавил сюда низкочастотные хештеги.
Канал Oracle Developer | Чатик💬
📘 Основы
#sql #plsql #теория #архитектура
#функции #секционирование #временныетаблицы
#транзакции #исключения #курсоры
#аналитическиефункции #иерархическиезапросы
#системныепредставления #компиляция #представления #коллекции #циклы
🛠 Практика и задачи
#задача #решениезадачи #asktom
🚀 Оптимизация и производительность
#оптимизация #nestedloops #индекс
🧩 Инструменты и технологии
#тестирование #postgresql #oracle #docker #oracle23c #ide #ai
💼 Карьера и Развитие
#карьера #собеседование #hr #тинькофф #magnit #вкусноиточка #leroymerlin #сбер #яндекс #Эффективность #КарьерныйРост #Denis_Kivillev #Работа
🎓 Дополнительные материалы
#видео #подкаст #аудиоподкаст #конкурс #марафон #юмор
—
В почти 700 (!) постах не мудрено заплутать. Поэтому решил сделать подобие навигации 😉
Не забывайте пользоваться обычным поиском, я не добавил сюда низкочастотные хештеги.
Канал Oracle Developer | Чатик💬