powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как проще всего в Оракле писать if exists()
45 сообщений из 45, показаны все 2 страниц
как проще всего в Оракле писать if exists()
    #39866960
Albatross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. мне нужно как в SQL Server

Код: plsql
1.
2.
3.
if exists (какой-то запрос) then
...
end if;




сейчас объявляю переменную

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare p number;

begin;
select count(*) into p from 

(<какой-то запрос>
where ...
and rownum=1) g;


end 


но наверняка можно как-то проще или короче.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39866963
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Albatrossнаверняка можно как-то проще или короче.

Можно: поставь свой exists в условие запроса, который ты зацензурил точками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39866973
Да ну
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Albatross,

Дело вкуса:
Код: plsql
1.
2.
3.
4.
 for rec in (какой-то запрос) loop
   ...
   exit; -- если в "каком-то запросе" не ограничено число строк = 1
 end loop;
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39866974
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Albatrossт.е. мне нужно как в SQL Server
Код: plsql
1.
2.
3.
if exists (какой-то запрос) then
...
end if;


Код: plsql
1.
2.
3.
for i in (select * from dual where exists(...)) loop
 ...
end loop;
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867142
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Albatross
Код: plsql
1.
2.
3.
if exists (какой-то запрос) then
...
end if;

В read commited это провокация.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867216
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Albatross
Код: plsql
1.
2.
3.
if exists (какой-то запрос) then
...
end if;


В read commited это провокация.это фигня по сравнению с тем, что в МССКЛ с настройками по умолчанию незакомиченный инсерт блокирует любой селект из таблицы
и коммит может не коммитить
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867248
Daniel Logovenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Albatrossт.е. мне нужно как в SQL Server

Код: plsql
1.
2.
3.
if exists (какой-то запрос) then
...
end if;

Зря пытаетесь свои знания по MS SQL Server на Oracle переносить.
Тут вам не там.

Вы же по велосипедной привычке крутить педали на мотоцикле не станете?!

Что по сути сделать нужно напишите.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867300
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-В read commited это провокация.
Почему?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867306
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev-2-В read commited это провокация.Почему?Такая проверка имеет смысл, когда с данными заведомо работает только текущая транзакция. Либо при авось-программировании, когда вероятность проявления ошибки, помноженная на убытки, меньше, чем стоимость написания корректного кода за вычетом некорректного.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867347
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Такая проверка имеет смысл, когда с данными заведомо работает только текущая транзакция. Либо при авось-программировании, когда вероятность проявления ошибки, помноженная на убытки, меньше, чем стоимость написания корректного кода за вычетом некорректного.
У вас все запросы с for update (от инсертов не спасет) или сразу блокируете все таблицы из которых будете читать данные или таки пользуетесь авось-программированием?))
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867367
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevУ вас все запросы с for update (от инсертов не спасет)Согласен. Чтобы спастить от инсертов, надо юзать select ... for insert.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867372
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevУ вас все запросы с for update
Не следует путать теплое с мягким
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867373
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevУ вас все запросы с for update (от инсертов не спасет) или сразу блокируете все таблицы Read commited это минное поле безотносительно if exists. Для его прохождения не обязательно блокировать всё и вся - целостность обеспечивают констрейнты. Без внятного обоснования, if exists просто мусор в коде.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867489
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

а более другой isolation-level? (чисто теоретический вопрос)
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867496
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--а более другой isolation-level? (чисто теоретический вопрос)
ORA-08177
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39867637
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousORA-08177какое-то разочарование
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868717
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadСогласен. Чтобы спастить от инсертов, надо юзать select ... for insert.
Не спасет. Если с повторяющимися чтениями можно выкрутиться блокировкой выборок, то с фантомными чтениями только блокировкой всего ресурса к которому идет совместный доступ, чтобы нельзя было параллельно вставлять записи для ресурса (в примере ниже ресурс - переговорная комната).

-2-Read commited это минное поле безотносительно if exists. Для его прохождения не обязательно блокировать всё и вся - целостность обеспечивают констрейнты. Без внятного обоснования, if exists просто мусор в коде.
Это не минное поле, это механизм совместной работы с данными, который нужно понимать. if exists всего лишь частный случай проверки, возвращает ли запрос хотя бы одну запись, ничего кошмарного в нем нет и мусора в коде такая конструкция не добавляет и им не является.

Констрейнты обеспечивают лишь самые простые ограничения целостности, бизнес логика гораздо сложнее чем возможности констрейнтов, возьмем самый простой пример у Кайта, есть переговорные комнаты, есть бронирование времени в них (вставка строк с интервалом с .. по), как простыми ограничениями целостности добиться чтобы интервалы не пересекались?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868743
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevкак простыми ограничениями целостности добиться чтобы интервалы не пересекались?Через FK начало=конец.
А как через if exists?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868758
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Через FK начало=конец.
Есть переговорка1, один сотрудник забронировал ее с 13 до 14 а другой с 16 до 18, третий с 15 до 17, к чему прикладывать FK?

-2-А как через if exists?
Никак, это конструкция языка не реализованная в Oracle, делает код проще и читабельнее в тех случаях когда она требуется.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868802
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevвозьмем самый простой пример у Кайта, есть переговорные комнаты, есть бронирование времени в них (вставка строк с интервалом с .. по), как простыми ограничениями целостности добиться чтобы интервалы не пересекались?
определиться с минимальным интервалом бронирования. час, полчаса, минута... не важно.

факт бронирования хранить как идентификатор комнаты + дата бронирования + интервал бронирования + доп. инфа (кто забронировал и т.п.)

на первые три поля наложить ограничение уникальности.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868805
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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, начало
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868827
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морейопределиться с минимальным интервалом бронирования. час, полчаса, минута... не важно.
Очень плохое решение.

xtender,
Месье знает толк в извращениях)), итого имеем две фиктивные строки на каждую комнату всегда и некоторое количество дополнительно, для второй комнаты на 2 реальных строки несущих информацию, три фиктивных, вместо двух простых вставок сплитование.

И все равно это не поможет, старт параллельной ветки никак не запрещен
room idначалоконецid сотрудника(NULL - свободно)2null2019-01-01 08:31:00null(свободно)
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868828
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevОчень плохое решениечем же?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868831
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей,

Бронь с 9 до 18 тремя блоками, берем интервал минуту и получаем вместо трех записей 540, для переговорной комнаты и интервала 10 или 15 минут такое решение еще можно как то пропихнуть, в общем случае оно не пригодно.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868833
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
iOracleDevИ все равно это не поможет, старт параллельной ветки никак не запрещенв Concepts бы тебе...
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868835
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevкит северных морей,

Бронь с 9 до 18 тремя блоками, берем интервал минуту и получаем вместо трех записей 540, для переговорной комнаты и интервала 10 или 15 минут такое решение еще можно как то пропихнуть, в общем случае оно не пригодно.
даже с минутным интервалом (который не нужен) вы выходите на условно существенные объемы только если вы сбербанк и у вас по всей стране целыми днями бронируют сто тыщ переговорок в каждом мухосранском допофисе. в любом другом случае... 1e5... 1e6 строк в день за то, что критичная бизнес-функциональность будет гарантирована СУБД, а не моими криворукими коллегами? легко.

а аппелировать к "общему случаю" бессмысленно - его никогда не бывает. всегда решается конкретная задача, в конкретных условиях, и с конкретными ограничениями.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868857
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev-2-А как через if exists?Никак, это конструкция языка не реализованная в Oracle, делает код проще и читабельнее в тех случаях когда она требуется.Либо ты тупо отмораживаешься, либо просто туп. Вопрос ведь не в "проще и читабельнее", а в том, способен ли ты для приведенной тобой же задачи корректно использовать гипотетический if exists.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39868858
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-iOracleDevпропущено...
Никак, это конструкция языка не реализованная в Oracle, делает код проще и читабельнее в тех случаях когда она требуется.Либо ты тупо отмораживаешься, либо просто туп. Вопрос ведь не в "проще и читабельнее", а в том, способен ли ты для приведенной тобой же задачи корректно использовать гипотетический if exists.если где-то в main таблице заблокировать комнату, то вполне
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869180
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxесли где-то в main таблице заблокировать комнату, то вполне
Именно так, или воспользоваться пакетом dbms_lock, а у ребят похоже oracle головного мозга, накидали говнорешений и полезли в бутылку.

-2-Либо ты тупо отмораживаешься, либо просто туп. Вопрос ведь не в "проще и читабельнее", а в том, способен ли ты для приведенной тобой же задачи корректно использовать гипотетический if exists.
Открой древнюю как яйца мамонта книжку "Том Кайт. Oracle для профессионалов: архитектура, методики программирования и особенности версий 9i и 10g", прочитай первую главу, и после прочтения скажи мне пожалуйста, можно корректно заменить select count(*) into l_cnt из примера на гипотетический if exists?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869196
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev можно корректно заменить select count(*) into l_cnt из примера на гипотетический if exists?
21979065
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869221
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
iOracleDev,

Ты уж трижды лажанулся, может пора остановиться? Предлагать повсеместную сериализацию доступа с лишним if exists, вместо обработки исключения при insert/merge - весьма глупо. Пытаться слиться, напирая на более редкие случаи чуть более сложной логики, да ещё и не разбираясь в теме и пытаться спроецировать собственное незнание на других - ещё более глупо. Смешно наблюдать, как ты пытаешься выдать пользовательские блокировки dmbs_lock как некое откровение... Погляди на историю -2- и andrey_anonymous, они это знали ещё задолго до твоего знакомства с ораклом
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869230
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous 21979065
Ты не понял, -2- имеет непонятные претензии к такой конструкции в принципе. Твой вариант с дополнительным этажом в запросе как то не очень, на мой взгляд этот вариант 21979064 лучше, кроме того if предполагает возможность создать секцию else, цикл такой секцией не обладает.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869252
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderiOracleDev,

Ты уж трижды лажанулся, может пора остановиться? Предлагать повсеместную сериализацию доступа с лишним if exists, вместо обработки исключения при insert/merge - весьма глупо. Пытаться слиться, напирая на более редкие случаи чуть более сложной логики, да ещё и не разбираясь в теме и пытаться спроецировать собственное незнание на других - ещё более глупо. Смешно наблюдать, как ты пытаешься выдать пользовательские блокировки dmbs_lock как некое откровение... Погляди на историю -2- и andrey_anonymous, они это знали ещё задолго до твоего знакомства с ораклом
Кайт дурак вы все умные, я так и понял, спасибо за науку.

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

При чем здесь вообще insert/merge, речь о чтении данных, а не о их записи, гипотетический if exists частный случай открытия курсора фетча одной строки и его закрытия, вы не используете в коде курсоры, у вас аллергия на fetch?

Хочешь пример для if exists попроще, есть настройки с флагом отправлять письма или нет, если флаг установлен, то отправить письмо, если не установлен не отправлять, где тут insert/merge?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869280
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, нужно... Бритва оккама - PL/SQL нетранзакционный.

SY.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869375
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev -2- имеет непонятные претензии к такой конструкции в принципе. Твой вариант с дополнительным этажом в запросе как то не очень, на мой взгляд этот вариант 21979064 лучше
1. -2- имеет очень понятные претензии к данной конструкции. Он исходит из того, что внутри ветвления предполагается работа с данными (модификация), зависящая от существования строки. Именно в этом случае конструкция может провоцировать data inconsistency. Если осознаете сей прискорбный факт - не придется нажимать так много кнопок в попытках убедить окружающих в собственной альтернативной гениальности.

2. "как-то не очень" - попробуйте отшлифовать свой взгляд на оселке реальности.

Примите в рассмотрение несколько аспектов:
- подзапрос в exists может быть сложным
- строки, отвечающие критерию, могут быть разрежены
- на втором уровне оптимизации pl/sql курсорный цикл внутренне преобразуется в bulk collect.
Проведите эксперименты, снимите трассировки, оцените в реальных ресурсах.

Кроме того, в объективной реальности существуют такие вещи, как сопровождаемость кода.
И с этой точки зрения exit в конце for-loop, кардинально меняющий смысл конструкции, хорошо просматривается только при ~пустом теле цикла. Напишите такой цикл с телом на полторы странички и устройте "коридорный тест" - попросите коллег "с листа" проинтерпретировать для Вас написанное - сможете оценить масштабы непонимания.
Фокус же с select from dual - достаточно старый, узнаваемый паттерн.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869380
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevДа, я считаю архитектурно правильно сделать сериализацию
...и это пройдёт. Рано или поздно Вы познакомитесь с более масштабными системами, нежели работаете сейчас - и понимание границ применимости сериализации придёт.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869389
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous1. -2- имеет очень понятные претензии к данной конструкции. Он исходит из того, что внутри ветвления предполагается работа с данными (модификация), зависящая от существования строки. Именно в этом случае конструкция может провоцировать data inconsistency. Если осознаете сей прискорбный факт - не придется нажимать так много кнопок в попытках убедить окружающих в собственной альтернативной гениальности.
Это относится к любому запросу в теле процедурного кода, данная конструкция лишь частный случай, почему то перевозбудивший местную аудиторию именно в таком ключе.

andrey_anonymous2. "как-то не очень" - попробуйте отшлифовать свой взгляд на оселке реальности.
Может быть, я обычно не использую циклы там где требуется прочитать одну строку.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869394
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev относится к любому запросу в теле процедурного кода
Не стоит обобщать сверх необходимого.
Сама дискуссия появилась как результат излишне общей формы исходного вопроса.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869429
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDevя обычно не использую циклы там где требуется прочитать одну строку.
Тогда используйте прямое управление курсором, ветвитесь по cursor%found.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869437
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousТогда используйте прямое управление курсором, ветвитесь по cursor%found.
Обычно так и делаю. Я не автор топика, просто поинтересовался чем так не угодила простая гипотетическая конструкция, частный вариант существующих механизмов, и тут понеслось
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869472
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
iOracleDevпросто поинтересовалсяна полторы страницы слабосвязного бреда с идиотскими отсылками?


iOracleDevтут понеслосьесли ты один в теме чего-то не понял, не надо устраивать истерические демарш и, просто попробуй понять о чем идёт речь.
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869498
mackz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как долго с нуля учиться програмить на oracle ?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869591
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mackzа как долго с нуля учиться програмить на oracle ?ноль
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39869602
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderесли ты один в теме чего-то не понял, не надо устраивать истерические демарш и, просто попробуй понять о чем идёт речь.
Я не понял что ты думаешь что я не понял? Кто устраивает истерические демарши, -2- ?
...
Рейтинг: 0 / 0
как проще всего в Оракле писать if exists()
    #39870041
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Albatross,

Я пропустил на фоне кормёжки тролля, для чего используется конструкция-то?
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как проще всего в Оракле писать if exists()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]