Комментарии 37
2. TO_CHAR(SYSDATE,'MONTH','NLS_LANGUAGE=RUSSIAN')
3. Начиная с 11g точно есть, раньше – лень смотреть
4. Такое поведение по умолчанию некорректно, но если очень надо, можно за полчаса написать скрипт, выдающий соответствующие полномочия, с использованием USER-DEPENDENCIES
Иногда нужен не именительный падеж. «Второго апреля», «Восьмого марта».
>> 3. Начиная с 11g точно есть, раньше – лень смотреть
Returning без into? Просто выдающий данные, как это делает Select? Можно пример?
У нас в текущей системе как раз 11g.
3. returning без into – очень странный запрос. Но если есть суровая революционная необходимость, то копайте в сторону ref_cursor или pipelined functions
3. Не думаю, что создать запись и в той же команде узнать её id (создаваемый автоинкрементно, в случае оракла через сиквенс) это странный запрос. Это самый распространённый запрос. Который хочется написать в PL/SQL Developer в одну строку, без создания переменной, вывода её значения и прочих шаманских танцев.
3. Автоинкремент – это плохой шаблон, триггер – тоже плохой шаблон. Так писали 20 лет назад, а сейчас так писать не надо. Гораздо лучше взять из базы значение последовательности, а идентификатор новой записи вычислять как S*1000+i, где i – номер вставляемой записи. Как тысячу записей вставили – взяли новый элемент последовательности.
Если так сделать, order by id не будет обеспечивать исторический порядок вставок в таблицу. Плюс проблемы со скоростью из-за дырок. Придётся делать order by datetime_creation, каковое поле может отсутствовать, это более ресурсоёмко, плюс учитывайте что время на компьютере меняется квантами (в винде в зависимости от настройки это от 10 до 55 милисекунд) то есть близкие по времени записи будут не в том порядке.
Имеющий дыры — промежутки праймари кей работает медленнее — это из практики, не теории. Что вы выигрываете своим методом? Скорость добавления в базу? Для закачки больших массивов данных используют BCP.
Своим методом я выигрываю уменьшение конкуренции за последовательность. Это не магический объект, а просто строка в системной таблице, обёрнутая «синтаксическим сахаром».
А вот мне даже любопытно, какая операция выполняется медленнее, если в PK есть промежутки? У меня фантазии не хватает.
Я не знаю точно, почему так.
- насколько прогрет кэш в первом и втором случае
- какие диапазоны идентификаторов (работа с длинными идентификаторами может быть чуть медленнее, чем с короткими, но заметно это на сценариях типа NUMBER vs VARCHAR2)
- какие параметры PCTFREE/PCTUSED у индекса и у таблицы
- сколько записей в таблицах
- не было ли массовых удалений из таблицы
Ну и так далее.
order by id не будет обеспечивать исторический порядок вставок в таблицу.
Вам правильно говорят, что у id не должно быть отношения порядка.
Да, придется делать поле datetime_creation, если вам нужно по нему выбирать.
С какой целью вам вообще нужно выбирать по дате вставки?
Чтобы логировать и показывать события в правильной последовательности?
Чтобы 18 марта 2019 года фирма заключала договора от 20115 до 20267, а не перечислять их номера через запятые?
Поле datetime_creation всё равно делать, чтобы помнить дату и время. Но это не гарантирует правильный порядок, как я показал выше.
Чтобы договор номер 2 не создавался раньше договора номер 1?
Это какие-то особенные договора? Может быть надо более явно отразить эту логику в коде и требованиях? Предположу, что договор 1 например о покупке товара, а договор 2 о продаже товара. Может их надо связать с какой-то сущностью "сделки"?
Может сделать в договоре 2 сделать ссылку на договор 1? Что-то в духе "на основании такого то".
Показывать события в нужной последовательности можно и с помощью datetime_creation.
Выборку договоров за 18 марта 2019 года можно тоже сделать по полю datetime_creation.
Кстати, а как вы без даты создания узнаете что диапазон договоров за эту дату начинается именно с 20115 и заканчивается на 20267?
Кстати, а как вы без даты создания узнаете что диапазон договоров за эту дату начинается именно с 20115 и заканчивается на 20267?Никак. Но мне не придётся передавать в функцию список id. Я передам два числа, от и до.
Показывать события в нужной последовательности можно и с помощью datetime_creation.сказано выше:
время на компьютере меняется квантами (в винде в зависимости от настройки это от 10 до 55 милисекунд) то есть близкие по времени записи будут не в том порядке.Например, менеджер заполнил форму о заключённых 5 договорах и нажал ОК. В системе они появились одновременно, но с порядком следования. Порядок следования будет потерян.
Но мне не придётся передавать в функцию список id. Я передам два числа, от и до.
Почему это лучше, чем передавать две даты?
Например, менеджер заполнил форму о заключённых 5 договорах и нажал ОК. В системе они появились одновременно, но с порядком следования. Порядок следования будет потерян.
Тут вопросы уже к заполняющей системе. Почему эти договоры заключаются одновременно, а не последовательно?
Что если в одном из договоров ошибка, а в других все нормально?
Про даты: а если той же функцией надо обработать 1 договор?
>> Что если в одном из договоров ошибка, а в других все нормально?
Это не повод для delete. В серьёзных системах никогда ничего не delete. Выставляют состояние — ошибка, удалён, клиент передумал, менеджер выдумал договор который не заключался, и всё такое.
а если той же функцией надо обработать 1 договор?
Я так понимаю, вы делаете одно и то же действие как над пачкой договоров, так и над одним.
Значит у вас будет функция обработки одного договора, которая принимает один id и другая функция, которая принимает диапазон дат и вызывает первую функцию.
Предполагаю, что следующее возражение будет о том, что у вас там глобальные переменные меняются и side-эффекты есть. Я угадал?
Значит все таки side-эффекты.
Это все у вас в СУБД делается что ли?
Ну тогда три функции. Одна с фильтром по диапазону дат, другая с указанием конкретного договора. Обе вызывают третью, в которой уже отправка емейла.
Это ведь наверняка два разных сценария использования. Там точно нужен один и тот же емейл?
Может быть при отправка одного договора "на посмотреть", его надо как-то иначе оформить?
Кстати если вы этот номер потом где-нибудь печатаете, то разглашаете часть бизнес-информации. Контрагент может понять сколько у вас было других договоров за какой-то период времени.
Как?
Сокращение хранить в базе как атрибут клиента, который редактируется вручную и должен быть уникальным.
А там, по задаче. Если не всегда есть интернет — формировать UID, если делать примитивно — то xor 1234567, и так далее по обстоятельствам.
Если надо показать себя крутым — то *1000+rand(1000) :)
Ну то есть вы сделаете другое поле, которое будет служить суррогатным ключом, а id будете держать чтобы помнить очередность заключения договоров?
Не проще ли сокращение сделать первичным ключом, а очередность помнить по дате?
атрибут клиента, который редактируется вручную
Вот это тоже непонятно. Зачем нам его редактировать?
Ну то есть вы его распечатали на какой-то официальной бумажке с печатями и подписями, а потом менеджер может просто взять и изменить идентификатор в базе и концы в воду.
Но вы же не будете ссылаться на эту таблицу из других таблиц через поле-текст?
Ну тут два варианта.
- Либо вы поддерживаете два уникальных поля, одно из которых нужно для определения порядка, потому что в системе могут заноситься несколько договоров одновременно.
- Либо вы используете один единственный id в целях уникальной идентификации и сокрытия бизнес-информации, а дату — для определения порядка заключения.
Вы серьезно думаете, что экономя на джойне по строковому id вы что-то выигрываете в первом варианте?
Дату нельзя использовать для определения порядка следования, я дважды написал, почему.
Если менеджер носит свой ноутбук и заключает договора в тех местах где не всегда ловит интернет, добавьте UID.
Так это всё равно все фирмы делают, но во всех проектах по-разному.
Не все и "по разному" тоже не просто так взялось. Почему вам нужна именно таблица для падежей месяцев? Почему не функция с case when then… end?
(deleted)
Идеально было бы передать в Росреестр на выполнение следующий скрипт:А причем, я извиняюсь, тут РР?! РР фиксирует результаты в виде записей КУ и ГРП. Если вы каким-то образом сумеете провернуть такую сделку — результаты её РР зарегистрирует. Имхо, тут вопрос не столько «транзакционности» — которую, кстати, РР вполне даже поддерживает, как минимум, в плане ГРП — сколько фондирования такой сделки.
Кроме этого, Росреестр не поддерживает обременение строящегося по ДДУ жилья, а мог бы, это элементарное действие в отношении простого фьючерса.?! Каким образом вы представляете себе обременение права, которого (пока ещё) нет? Можно даже «на пальцах». ДДУ — сам по себе уже эдакий «фьючерс права». И начинать надо, наверное, не с РР, а с наличия отсутствия КФО, готовых участвовать в таком — скажем так — деле :-)
На всякий случай, если я вас не так понял. Если же речь об обременении самого ДДУ — то РР это вполне себе поддерживает.
А причем, я извиняюсь, тут РР?! РР фиксирует результаты в виде записей КУ и ГРП.Вот именно. По одной и раздельно. А у меня в примере — транзакция, с вложенной транзакцией внутри неё, и блоком TRY-EXCEPT. И этого он не может. И я описал негативные последствия.
Если уж и «хотеть» такого рода «транзакционность», то надо хотеть это на той стороне, что проводит сделки… вводить какого-либо рода «гаранта», в лице банка, или чего-то типа «дом.рф» и уже там, «наворачивать» с «Деньги X передать Y» и прочими «ЕСЛИ_ОШИБКА».
А РР и пять лет назад (точно, даже 7… может и раньше) мог обрабатывать обращение, в котором несколько связанных заявлений (в вашем случае — их будет три) о «переходе права».
Ну, не знаю… Начнём с того, что Росреестр не ведёт приём граждан. Приём граждан ведёт МФЦ. Я пытался через МФЦ подать одновременно две операции — снять обременение и зарегистрировать куплю-продажу, мне отказали. Сказали, что сначала требуется выполнить одно, а затем другое.
Сначала снимается обременение и только потом появляется возможность проводить сделки с объектом недвижимости. И не забывайте о Регламенте работы РР. Ваши заявления обрабатываются не 1сек, а несколько дней-недель, а то и месяцев.
Когда Delphi программа посылает на сервер две команды, не обязательно связанные транзакцией, это всё равно лучше делать одним запросом, чтобы не удвоить издержки на обмен данными.
Мои пожелания к СУБД будущего, а также к Росреестру в части транзакционности