Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как проще всего в Оракле писать if exists() / 25 сообщений из 45, страница 1 из 2
25.09.2019, 16:07
    #39866960
Albatross
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как проще всего в Оракле писать if exists()
т.е. мне нужно как в 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
25.09.2019, 16:09
    #39866963
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как проще всего в Оракле писать if exists()
Albatrossнаверняка можно как-то проще или короче.

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

Дело вкуса:
Код: plsql
1.
2.
3.
4.
 for rec in (какой-то запрос) loop
   ...
   exit; -- если в "каком-то запросе" не ограничено число строк = 1
 end loop;
...
Рейтинг: 0 / 0
25.09.2019, 16:24
    #39866974
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как проще всего в Оракле писать if exists()
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
26.09.2019, 06:53
    #39867142
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как проще всего в Оракле писать if exists()
Albatross
Код: plsql
1.
2.
3.
if exists (какой-то запрос) then
...
end if;

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Бронь с 9 до 18 тремя блоками, берем интервал минуту и получаем вместо трех записей 540, для переговорной комнаты и интервала 10 или 15 минут такое решение еще можно как то пропихнуть, в общем случае оно не пригодно.
...
Рейтинг: 0 / 0
30.09.2019, 01:49
    #39868833
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как проще всего в Оракле писать if exists()
iOracleDevИ все равно это не поможет, старт параллельной ветки никак не запрещенв Concepts бы тебе...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как проще всего в Оракле писать if exists() / 25 сообщений из 45, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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