powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как проще всего в Оракле писать if exists()
25 сообщений из 45, страница 1 из 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
25 сообщений из 45, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как проще всего в Оракле писать if exists()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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