|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
т.е. мне нужно как в SQL Server Код: plsql 1. 2. 3.
сейчас объявляю переменную Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
но наверняка можно как-то проще или короче. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2019, 16:07 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
Albatrossнаверняка можно как-то проще или короче. Можно: поставь свой exists в условие запроса, который ты зацензурил точками. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2019, 16:09 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
Albatross, Дело вкуса: Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2019, 16:24 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
Albatrossт.е. мне нужно как в SQL Server Код: plsql 1. 2. 3.
Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2019, 16:24 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
Albatross Код: plsql 1. 2. 3.
В read commited это провокация. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 06:53 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
-2-Albatross Код: plsql 1. 2. 3.
В read commited это провокация.это фигня по сравнению с тем, что в МССКЛ с настройками по умолчанию незакомиченный инсерт блокирует любой селект из таблицы и коммит может не коммитить ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 10:55 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
Albatrossт.е. мне нужно как в SQL Server Код: plsql 1. 2. 3.
Зря пытаетесь свои знания по MS SQL Server на Oracle переносить. Тут вам не там. Вы же по велосипедной привычке крутить педали на мотоцикле не станете?! Что по сути сделать нужно напишите. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 12:13 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
-2-В read commited это провокация. Почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 13:44 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDev-2-В read commited это провокация.Почему?Такая проверка имеет смысл, когда с данными заведомо работает только текущая транзакция. Либо при авось-программировании, когда вероятность проявления ошибки, помноженная на убытки, меньше, чем стоимость написания корректного кода за вычетом некорректного. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 13:53 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
-2-Такая проверка имеет смысл, когда с данными заведомо работает только текущая транзакция. Либо при авось-программировании, когда вероятность проявления ошибки, помноженная на убытки, меньше, чем стоимость написания корректного кода за вычетом некорректного. У вас все запросы с for update (от инсертов не спасет) или сразу блокируете все таблицы из которых будете читать данные или таки пользуетесь авось-программированием?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 14:48 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevУ вас все запросы с for update (от инсертов не спасет)Согласен. Чтобы спастить от инсертов, надо юзать select ... for insert. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:20 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevУ вас все запросы с for update Не следует путать теплое с мягким ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:24 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevУ вас все запросы с for update (от инсертов не спасет) или сразу блокируете все таблицы Read commited это минное поле безотносительно if exists. Для его прохождения не обязательно блокировать всё и вся - целостность обеспечивают констрейнты. Без внятного обоснования, if exists просто мусор в коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 15:25 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
-2-, а более другой isolation-level? (чисто теоретический вопрос) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 18:30 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
--Eugene--а более другой isolation-level? (чисто теоретический вопрос) ORA-08177 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2019, 18:39 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
andrey_anonymousORA-08177какое-то разочарование ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2019, 00:01 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
AmKadСогласен. Чтобы спастить от инсертов, надо юзать select ... for insert. Не спасет. Если с повторяющимися чтениями можно выкрутиться блокировкой выборок, то с фантомными чтениями только блокировкой всего ресурса к которому идет совместный доступ, чтобы нельзя было параллельно вставлять записи для ресурса (в примере ниже ресурс - переговорная комната). -2-Read commited это минное поле безотносительно if exists. Для его прохождения не обязательно блокировать всё и вся - целостность обеспечивают констрейнты. Без внятного обоснования, if exists просто мусор в коде. Это не минное поле, это механизм совместной работы с данными, который нужно понимать. if exists всего лишь частный случай проверки, возвращает ли запрос хотя бы одну запись, ничего кошмарного в нем нет и мусора в коде такая конструкция не добавляет и им не является. Констрейнты обеспечивают лишь самые простые ограничения целостности, бизнес логика гораздо сложнее чем возможности констрейнтов, возьмем самый простой пример у Кайта, есть переговорные комнаты, есть бронирование времени в них (вставка строк с интервалом с .. по), как простыми ограничениями целостности добиться чтобы интервалы не пересекались? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2019, 20:54 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevкак простыми ограничениями целостности добиться чтобы интервалы не пересекались?Через FK начало=конец. А как через if exists? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2019, 21:50 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
-2-Через FK начало=конец. Есть переговорка1, один сотрудник забронировал ее с 13 до 14 а другой с 16 до 18, третий с 15 до 17, к чему прикладывать FK? -2-А как через if exists? Никак, это конструкция языка не реализованная в Oracle, делает код проще и читабельнее в тех случаях когда она требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2019, 22:17 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevвозьмем самый простой пример у Кайта, есть переговорные комнаты, есть бронирование времени в них (вставка строк с интервалом с .. по), как простыми ограничениями целостности добиться чтобы интервалы не пересекались? определиться с минимальным интервалом бронирования. час, полчаса, минута... не важно. факт бронирования хранить как идентификатор комнаты + дата бронирования + интервал бронирования + доп. инфа (кто забронировал и т.п.) на первые три поля наложить ограничение уникальности. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 00:11 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevк чему прикладывать FK?крайне просто же: room id начало конец id сотрудника(NULL - свободно)1nullnullnull(свободно)2null2019-01-01 08:30:00null(свободно)22019-01-01 08:30:002019-01-01 09:30:001 (занято)22019-01-01 09:30:002019-01-01 11:00:00null (свободно)22019-01-01 11:00:002019-01-01 11:30:002 (занято)22019-01-01 11:30:00nullnull (свободно) fk конец->начало unique: room id, начало ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 00:19 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
кит северных морейопределиться с минимальным интервалом бронирования. час, полчаса, минута... не важно. Очень плохое решение. xtender, Месье знает толк в извращениях)), итого имеем две фиктивные строки на каждую комнату всегда и некоторое количество дополнительно, для второй комнаты на 2 реальных строки несущих информацию, три фиктивных, вместо двух простых вставок сплитование. И все равно это не поможет, старт параллельной ветки никак не запрещен room idначалоконецid сотрудника(NULL - свободно)2null2019-01-01 08:31:00null(свободно) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 01:27 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevОчень плохое решениечем же? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 01:31 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
кит северных морей, Бронь с 9 до 18 тремя блоками, берем интервал минуту и получаем вместо трех записей 540, для переговорной комнаты и интервала 10 или 15 минут такое решение еще можно как то пропихнуть, в общем случае оно не пригодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 01:44 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevИ все равно это не поможет, старт параллельной ветки никак не запрещенв Concepts бы тебе... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 01:49 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevкит северных морей, Бронь с 9 до 18 тремя блоками, берем интервал минуту и получаем вместо трех записей 540, для переговорной комнаты и интервала 10 или 15 минут такое решение еще можно как то пропихнуть, в общем случае оно не пригодно. даже с минутным интервалом (который не нужен) вы выходите на условно существенные объемы только если вы сбербанк и у вас по всей стране целыми днями бронируют сто тыщ переговорок в каждом мухосранском допофисе. в любом другом случае... 1e5... 1e6 строк в день за то, что критичная бизнес-функциональность будет гарантирована СУБД, а не моими криворукими коллегами? легко. а аппелировать к "общему случаю" бессмысленно - его никогда не бывает. всегда решается конкретная задача, в конкретных условиях, и с конкретными ограничениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 02:07 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDev-2-А как через if exists?Никак, это конструкция языка не реализованная в Oracle, делает код проще и читабельнее в тех случаях когда она требуется.Либо ты тупо отмораживаешься, либо просто туп. Вопрос ведь не в "проще и читабельнее", а в том, способен ли ты для приведенной тобой же задачи корректно использовать гипотетический if exists. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 06:49 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
-2-iOracleDevпропущено... Никак, это конструкция языка не реализованная в Oracle, делает код проще и читабельнее в тех случаях когда она требуется.Либо ты тупо отмораживаешься, либо просто туп. Вопрос ведь не в "проще и читабельнее", а в том, способен ли ты для приведенной тобой же задачи корректно использовать гипотетический if exists.если где-то в main таблице заблокировать комнату, то вполне ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 06:58 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
andreymxесли где-то в main таблице заблокировать комнату, то вполне Именно так, или воспользоваться пакетом dbms_lock, а у ребят похоже oracle головного мозга, накидали говнорешений и полезли в бутылку. -2-Либо ты тупо отмораживаешься, либо просто туп. Вопрос ведь не в "проще и читабельнее", а в том, способен ли ты для приведенной тобой же задачи корректно использовать гипотетический if exists. Открой древнюю как яйца мамонта книжку "Том Кайт. Oracle для профессионалов: архитектура, методики программирования и особенности версий 9i и 10g", прочитай первую главу, и после прочтения скажи мне пожалуйста, можно корректно заменить select count(*) into l_cnt из примера на гипотетический if exists? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 14:47 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDev можно корректно заменить select count(*) into l_cnt из примера на гипотетический if exists? 21979065 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 15:04 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDev, Ты уж трижды лажанулся, может пора остановиться? Предлагать повсеместную сериализацию доступа с лишним if exists, вместо обработки исключения при insert/merge - весьма глупо. Пытаться слиться, напирая на более редкие случаи чуть более сложной логики, да ещё и не разбираясь в теме и пытаться спроецировать собственное незнание на других - ещё более глупо. Смешно наблюдать, как ты пытаешься выдать пользовательские блокировки dmbs_lock как некое откровение... Погляди на историю -2- и andrey_anonymous, они это знали ещё задолго до твоего знакомства с ораклом ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 15:24 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
andrey_anonymous 21979065 Ты не понял, -2- имеет непонятные претензии к такой конструкции в принципе. Твой вариант с дополнительным этажом в запросе как то не очень, на мой взгляд этот вариант 21979064 лучше, кроме того if предполагает возможность создать секцию else, цикл такой секцией не обладает. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 15:30 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
xtenderiOracleDev, Ты уж трижды лажанулся, может пора остановиться? Предлагать повсеместную сериализацию доступа с лишним if exists, вместо обработки исключения при insert/merge - весьма глупо. Пытаться слиться, напирая на более редкие случаи чуть более сложной логики, да ещё и не разбираясь в теме и пытаться спроецировать собственное незнание на других - ещё более глупо. Смешно наблюдать, как ты пытаешься выдать пользовательские блокировки dmbs_lock как некое откровение... Погляди на историю -2- и andrey_anonymous, они это знали ещё задолго до твоего знакомства с ораклом Кайт дурак вы все умные, я так и понял, спасибо за науку. Да, я считаю архитектурно правильно сделать сериализацию и не плодить мусорные записи для костыльного обеспечения целостности, при этом обеспечивая ту же самую сериализацию только через одно место. При чем здесь вообще insert/merge, речь о чтении данных, а не о их записи, гипотетический if exists частный случай открытия курсора фетча одной строки и его закрытия, вы не используете в коде курсоры, у вас аллергия на fetch? Хочешь пример для if exists попроще, есть настройки с флагом отправлять письма или нет, если флаг установлен, то отправить письмо, если не установлен не отправлять, где тут insert/merge? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 15:48 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
Можно, нужно... Бритва оккама - PL/SQL нетранзакционный. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 16:09 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDev -2- имеет непонятные претензии к такой конструкции в принципе. Твой вариант с дополнительным этажом в запросе как то не очень, на мой взгляд этот вариант 21979064 лучше 1. -2- имеет очень понятные претензии к данной конструкции. Он исходит из того, что внутри ветвления предполагается работа с данными (модификация), зависящая от существования строки. Именно в этом случае конструкция может провоцировать data inconsistency. Если осознаете сей прискорбный факт - не придется нажимать так много кнопок в попытках убедить окружающих в собственной альтернативной гениальности. 2. "как-то не очень" - попробуйте отшлифовать свой взгляд на оселке реальности. Примите в рассмотрение несколько аспектов: - подзапрос в exists может быть сложным - строки, отвечающие критерию, могут быть разрежены - на втором уровне оптимизации pl/sql курсорный цикл внутренне преобразуется в bulk collect. Проведите эксперименты, снимите трассировки, оцените в реальных ресурсах. Кроме того, в объективной реальности существуют такие вещи, как сопровождаемость кода. И с этой точки зрения exit в конце for-loop, кардинально меняющий смысл конструкции, хорошо просматривается только при ~пустом теле цикла. Напишите такой цикл с телом на полторы странички и устройте "коридорный тест" - попросите коллег "с листа" проинтерпретировать для Вас написанное - сможете оценить масштабы непонимания. Фокус же с select from dual - достаточно старый, узнаваемый паттерн. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 17:55 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevДа, я считаю архитектурно правильно сделать сериализацию ...и это пройдёт. Рано или поздно Вы познакомитесь с более масштабными системами, нежели работаете сейчас - и понимание границ применимости сериализации придёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 18:00 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
andrey_anonymous1. -2- имеет очень понятные претензии к данной конструкции. Он исходит из того, что внутри ветвления предполагается работа с данными (модификация), зависящая от существования строки. Именно в этом случае конструкция может провоцировать data inconsistency. Если осознаете сей прискорбный факт - не придется нажимать так много кнопок в попытках убедить окружающих в собственной альтернативной гениальности. Это относится к любому запросу в теле процедурного кода, данная конструкция лишь частный случай, почему то перевозбудивший местную аудиторию именно в таком ключе. andrey_anonymous2. "как-то не очень" - попробуйте отшлифовать свой взгляд на оселке реальности. Может быть, я обычно не использую циклы там где требуется прочитать одну строку. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 18:07 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDev относится к любому запросу в теле процедурного кода Не стоит обобщать сверх необходимого. Сама дискуссия появилась как результат излишне общей формы исходного вопроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 18:11 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevя обычно не использую циклы там где требуется прочитать одну строку. Тогда используйте прямое управление курсором, ветвитесь по cursor%found. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 18:38 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
andrey_anonymousТогда используйте прямое управление курсором, ветвитесь по cursor%found. Обычно так и делаю. Я не автор топика, просто поинтересовался чем так не угодила простая гипотетическая конструкция, частный вариант существующих механизмов, и тут понеслось ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 18:44 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
iOracleDevпросто поинтересовалсяна полторы страницы слабосвязного бреда с идиотскими отсылками? iOracleDevтут понеслосьесли ты один в теме чего-то не понял, не надо устраивать истерические демарш и, просто попробуй понять о чем идёт речь. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 19:19 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
а как долго с нуля учиться програмить на oracle ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 20:06 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
mackzа как долго с нуля учиться програмить на oracle ?ноль ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 22:07 |
|
как проще всего в Оракле писать if exists()
|
|||
---|---|---|---|
#18+
xtenderесли ты один в теме чего-то не понял, не надо устраивать истерические демарш и, просто попробуй понять о чем идёт речь. Я не понял что ты думаешь что я не понял? Кто устраивает истерические демарши, -2- ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2019, 22:27 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1882026]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 156ms |
0 / 0 |