|
|
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Добрый день господа! Стоит задача у меня: перевести готовую базу из MS SQL Server в ORACLE. Я очень и очень плохо знаю ORACLE, не все получается. Есть несколько вопросов. Как я понимаю в Oracle нет функции ISNUMERIC. Написал собственную функцию. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Может есть попроще? Функция проверяет только целые числа, пока мне и этого достаточно. В MS SQL Server можно создать скалярную функцию (не знаю как называется в Oracle), которую можно использовать в Constraint, чтобы ставить ограничение при вводе данных. Можно ли и в Oracle использовать собственную функцию? Попробовал вот так по аналогию с MS SQL Server. Не получается. Код: plsql 1. 2. Спасибо заранее за подсказку / ссылку и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:12 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, может стоит научиться пользоваться поиском? тогда и писать надо будет меньше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:14 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Vint, Искал. Не нашёл. Поэтому написал. Если знаете как в constraint использовать собственную функцию подскажите please. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:16 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:19 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, звиздиш. ленивый нуб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:22 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Anatoly B, Спасибо за ссылку, но там нет то, что я ищу. Как в constraint использовать собственную функцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:24 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenМожно ли и в Oracle использовать собственную функцию? В Oracle можно объявить поле типа NUMBER и оно автоматически будет ограничено только числами. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:25 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Vintstudieren, звиздиш. ленивый нуб. Ну и где же написано как можно применить собственную функцию в constraint? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:27 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovstudierenМожно ли и в Oracle использовать собственную функцию? В Oracle можно объявить поле типа NUMBER и оно автоматически будет ограничено только числами. К сожалению не могу. Там 9-значные цифры, первая цифра "0". Если объявить как число, то первый символ пропадёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:28 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
В check-констрейнте нельзя использовать самописные функции Но тебе достаточно TRANSLATE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:31 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Почему бы просто не создать поле с типом NUMBER? translate в помощь по поводу цифр в строке. У Check constraint есть ограничения, например, нельзя использовать самописные функции. А вот засутить translate в сам констрэинт можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:34 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Забыл обновиться =\ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:36 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenК сожалению не могу. Там 9-значные цифры, первая цифра "0". Если объявить как число, то первый символ пропадёт. Это всего лишь проблема форматирования при выводе. Но даже если держать это значение как строку, пользовательская функция не нужна пока есть regexp_like. Достаточно научиться писать регэкспы. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:37 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровВ check-констрейнте нельзя использовать самописные функции Но тебе достаточно TRANSLATE Dimitry SibiryakovЭто всего лишь проблема форматирования при выводе. Но даже если держать это значение как строку, пользовательская функция не нужна пока есть regexp_like. Достаточно научиться писать регэкспы. Спасибо за наводку, не знал что нельзя. Сейчас попробую TRANSLATE или regexp_like. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:42 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, (само)введение в заблкждение. лидирующий ноль означает, что данные у тебя не число, а строка, состоящая из цифр. и msный isnumeric не обеспечивает проверки, что строка из только цифр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 14:54 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, Посмотрите эти продукты - Database Migration Guide (12с) - 2. SQL Developer: Migrating Third-Party Databases ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 15:26 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Пост "р/лтрим" сфокусировал правильно вопрос. Должно быть быстрее так (да и учитывает не только целые числа): Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 15:36 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
MakeSure Код: plsql 1. К сожалению, это нестабильный код, поскольку зависит от окружения сессии. Конкретно - от NLS_NUMERIC_CHARACTERS Поправить - просто, примеров на форуме - мульон, особенно от нашего официального тирана Elic ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 15:40 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Преобразователь Неявный, само собой по нлс параметры надо позаботиться. Я, в целом, о том, что транслэйт тут будет значительно медленней, чем to_number. К тому же to_number вызовет ошибку более читабельную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 15:46 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
UPD Еще учесть надо to_number('3E10') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 16:08 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
MakeSureUPD Еще учесть надо to_number('3E10') Учесть надо второй и третий параметр to_number, блин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 16:11 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 17:34 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
SY Код: plsql 1. 2. 3. 4. 5. 6. SY.плохо, что ошибка неявная и х.з. где возникает через год юзверь позвонит в полтретьего ночи - че за фигня? потом хрен вспомнишь, что это твой же констрейнт по его же ТЗ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 17:49 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Возник ещё 1 вопрос. Хотел установить ограничение на дату документа (запретить на ввод будущей даты). Запускаю скрипт, а ORCLE ругается: Код: plsql 1. 2. 3. Ругается так: Oracle Error: ORA-02436 Date or system variable wrongly specified in CHECK constraint А как надо было написать? Разве нельзя использовать SYSDATE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2016, 10:35 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenРазве нельзя использовать SYSDATE?RTFM Restrictions on Check Constraints (FAQ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2016, 10:38 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Elic, Спасибо за ссылку. Правильно ли я понял, что в CONSTRAINT нельзя устанавливать запрет на будущую дату, т.к. в этом случае мне пришлось бы использовать "functions that are not deterministic"? Только в триггере могу ставить такое ограничение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2016, 10:47 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenПравильно ли я понялПолагаешь, документация тебя обманывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2016, 11:21 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Приветствую форумчан! Как получить весь список внешних ключей? В MS SQL Server запрос примерно выглядел бы так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. А как в ORACLE не знаю. :( Спасибо заранее за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2016, 13:06 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
https://oracle-base.com/dba/scripts http://www.orafaq.com/wiki/Scripts ... and much much more ... http://www.google.com/search?hl=en&q=oracle DBA Scripts ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2016, 13:28 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Viewer, Thank you very much. Ушёл изучать скрипты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2016, 13:34 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenКак получить весь список внешних ключей? sys.foreign_keys -> dba_constraints (type = 'R') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2016, 13:38 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2016, 13:38 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
В MS Sql Server в триггерах можно ссылаться на логические таблицы "Inserted" и "Deleted". В таблице "Inserted" все введённые новые записи, а в "Deleted" соответственно все удаленные записи. Как я понял в Oracle я должен добавить перед полем ":new." или ":old.", чтобы получить новое и старое значение. Но это немножко не то. Мне нужно именно в виде таблицы, что-то вроде "Inserted" и "Deleted". Что для этого надо делать? P.S. Хотел создать временную таблицу "на лету" как в MS Sql Server и добавить туда все ":new." и ":old.", ну так в ORACLE нет временных таблиц как в MS Sql Server. Как выйти из ситуации? :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 08:05 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenКак выйти из ситуации?Менять мировоззрение, читая документацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 08:24 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Что-то я не понимаю. Написал триггер на вставку и на изменение. Если в таблице меняю что-то, то ORACLE ругается " ... is mutating, trigger/function may not see it ". Прочёл в вышеуказанной ссылке (в предыдущем посте), что нужно написать какой-то COMPOUND TRIGGER при чём для VIEW. Т.е. чтобы триггер у меня начал работать так как мне надо, сначала создаю VIEW и пишу триггер на VIEW. А почему сразу не на таблицу? Бред какой-то. Зачем мне лишнее представление? В MS SQL Server проще простого. :( Может я не правильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 13:36 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenНаписал триггер на вставку и на изменение. Если в таблице меняю что-то А что, просто присвоить нужные новые значения :new не судьба?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 13:40 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, После многочисленных экспериментов путём проб и ошибок выяснил следующее: если триггер на изменение (не важно BEFORE или AFTER), то внутри тела триггера нельзя оказывается ссылаться на таблицу триггера (т.е. на ту таблицу, для которой был написан собственно сам триггер). Пример. Допустим у меня есть таблица "Контракт" и есть "Платежи". Хочу скажем проверить общую сумму всех платежей, которая согласно бизнес правилам не должна превышать сумму контракта. Пишу триггер для платежей. Допустим кто-то ввел 2 платежа: 1000$ и 500$, общая сумма не превышает сумму контракта (1500$). Но кто-то решил подкорректировать сумму: вместо 1000 скажем 1100. Вот тут триггер должен запретить изменение, т.к. общая сумма в таком случае получится 1600$. И как же тогда мне нужно узнать общую сумму платежей? P.S. В MS SQL Server нет таких ограничений, можно изменяемые записи сверять со всей таблицей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:08 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren нет таких ограниченийотвлекись от триггера и подумай, что будет, если два пользователя одновременно вставляют в пределах лимита, но более половины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:16 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
про мутацию http://www.sql.ru/faq/faq_topic.aspx?fid=513 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:21 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
афтер статемент, В любом случае общая сумма не должна превышать. Тот, кто первым успел сохранить "правильные" данные, то его данные должны быть в базе данных. А тот, кто опоздал и его данные уже "кривые", вот тут программа пусть ругает как следует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:21 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, авторДопустим у меня есть таблица "Контракт" и есть "Платежи". Хочу скажем проверить общую сумму всех платежей, которая согласно бизнес правилам не должна превышать сумму контракта. Пишу триггер для платежей. Допустим кто-то ввел 2 платежа: 1000$ и 500$, общая сумма не превышает сумму контракта (1500$). Но кто-то решил подкорректировать сумму: вместо 1000 скажем 1100 ... В MS SQL Server нет таких ограничений вопрос, мона? т.е. если в одном операторе insert вставляешь 2 записи. (нет ещё коммита) и другой меняет (пытается) одну из вставляемых записей. то 1-ая вставка insert увидит изменения от 2-ой? так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:25 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenА тот, кто опоздал и его данные уже "кривые", вот тут программа пусть ругает как следует. Обломись. Триггерами (в особенности такими) этого не сделать. Открой для себя мир транзакций с уровнем выше чем dirty read. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:25 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenкто первым успел сохранитья тебе предлагал подумать, а не продолжать демонстрировать непонимание изоляции транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 15:29 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
tru55про мутацию http://www.sql.ru/faq/faq_topic.aspx?fid=513 Спасибо за ссылку. Прочёл несколько раз, но так и не смог осилить как адаптировать в моём случае. Не могли бы подсказать? Допустим есть таблица "контракт". Код: plsql 1. 2. 3. 4. 5. 6. 7. Есть также "платежи" Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Добавляем записи. Код: plsql 1. 2. 3. 4. 5. 6. Теперь мне нужно запретить пользователю внести любые изменения в сумме платежа, если общая сумма превышает сумму контракта. Как это сделать в Oracle не знаю. Скажу честно, моего уровня знания не хватает в данном вопросе. Я недавно стал изучать ORACLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 09:30 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Пересчитывать сумму в родительской записи, а на нее уже повесить проверку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 09:42 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, В смысле в таблицу "Contract" добавить вычисляемое поле и триггер добавить туда? Допустим, я так и сделаю. Когда пользователь попытается исправить в платежах, разве триггер контракта тоже заработает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 09:52 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Или я не правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 09:56 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Да правильно Примерно так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 10:11 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Спасибо. Я понял Вашу мысль. Любое изменение в платежах нужно с помощью триггера отразить в дополнительном поле в контрактах. Если сумма превышает, то тогда и происходит исключение. ОК. Если не найду другое решение, то так и сделаю. Может есть ещё вариант? К сожалению, не всегда такое решение для меня приемлемо. Есть ещё сложные проверки данных в других таблицах на предмет пересекающихся диапазонов, вот там я в любом случае должен просмотреть все записи в "мутирующей" таблице. Хорошо, создам дополнительное представление (view) и туда попробую внедрить триггер. Если не ошибаюсь Compound trigger (или как там правильно называется?). Соответственно в клиентском приложении тогда буду иметь дело только с view. Как тогда решается проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 10:27 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren Если не ошибаюсь Compound trigger (или как там правильно называется?). Соответственно в клиентском приложении тогда буду иметь дело только с view. Как тогда решается проблема? 19080443 Using Compound DML Triggers to Avoid Mutating-Table Error с примером ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 10:53 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Ты путаешь INSTEAD OF триггер (на VIEW) и COMPAUND триггер. Последний -- это просто объединение триггеров на разные события в одном куске кода, что удобней при использовании например локальных PL/SQL коллекций для обхода той же мутации. Типо: в секции BEFORE STATEMENT заполняешь коллекцию текущим состоянием, а затем в секциях BEFORE/AFTER EACH ROW проверяешь не нарушает ли условие конкретная запись (на основании коллекции, чтоб не лезть в таблицу). При этом ты, естественно, не видишь изменений других сеансов (добавленных строк, например) и если не предусмотрена какая-либо сериализация (та же блокировка родительской записи) -- все твоя проверка может пойти лесом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 10:53 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудровcreate trigger contr_trg before insert or update on contractиспользовать триггер для проверки допустимости значения очень однопло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 10:58 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Не спорю, CHECK намного лучше А еще и индекс на FOREIGN KEY построить Но это таки пример -- вводить и объяснять новые понятия нет желания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 11:02 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenВячеслав Любомудров, Спасибо. Я понял Вашу мысль. Любое изменение в платежах нужно с помощью триггера отразить в дополнительном поле в контрактах. Если сумма превышает, то тогда и происходит исключение. ОК. Если не найду другое решение, то так и сделаю. только внимательней со своим кодом, а то апдейт фк может не сработать, как мне показалось Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 11:10 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровТы путаешь INSTEAD OF триггер (на VIEW) и COMPAUND триггер. Последний -- это просто объединение триггеров на разные события в одном куске кода, что удобней при использовании например локальных PL/SQL коллекций для обхода той же мутации. Типо: в секции BEFORE STATEMENT заполняешь коллекцию текущим состоянием, а затем в секциях BEFORE/AFTER EACH ROW проверяешь не нарушает ли условие конкретная запись (на основании коллекции, чтоб не лезть в таблицу). При этом ты, естественно, не видишь изменений других сеансов (добавленных строк, например) и если не предусмотрена какая-либо сериализация (та же блокировка родительской записи) -- все твоя проверка может пойти лесом Ну допустим, пользователь по конкретному контракту только 1, в смысле если я ввожу данные по одному контракту, то никто параллельно в этот момент не работает с данным контрактам. Соответственно, исключаем возможность других сеансов по конкретной записи. Или другой пример. Допустим я единственный пользователь базы. Т.е. пусть даже триггер не видит, что делают другие пользователи, а имеет дело только с конкретным пользователем. Я хочу исправить сумму платежа на большую и тут триггер должен меня остановить сообщив об ошибке. Неужели триггер на изменение никак не может просмотреть всю таблицу только по данному контракту? Неужели в корпорации ORACLE не предусмотрели такой поворот событий? Почему то в MS SQL Server нет таких проблем вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 11:16 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenПочему то в MS SQL Server нет таких проблем вообще. MS SQL - тупой блокировочник. Фактически, он работает в однопользовательском режиме. Поэтому у него нет проблем с конкурентным доступом к данным. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 12:31 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovstudierenПочему то в MS SQL Server нет таких проблем вообще. MS SQL - тупой блокировочник. Фактически, он работает в однопользовательском режиме. Поэтому у него нет проблем с конкурентным доступом к данным. Я с Вами не согласен. В MS SQL Server с одной таблицей могут работать сразу несколько пользователей и при этом триггер спокойно видит все сохранённые данные. Да, там тоже может быть блокировка, но как правило, так происходит если 2 пользователя правят одну и ту же запись. Вот тогда тот, кто успел первым сохранить, то его данные и будут в базе. А у второго - ошибка блокировки. Но на практике одну и ту же запись 2 пользователя почти никогда не правят. Поэтому кто тупой, MS SQL Server или ORACLE в данном вопросе очень и очень спорно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 12:41 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
dba123studierenВячеслав Любомудров, Спасибо. Я понял Вашу мысль. Любое изменение в платежах нужно с помощью триггера отразить в дополнительном поле в контрактах. Если сумма превышает, то тогда и происходит исключение. ОК. Если не найду другое решение, то так и сделаю. только внимательней со своим кодом, а то апдейт фк может не сработать, как мне показалось Код: plsql 1. Все, заклевали Нафиг я сюда вообще влез studierenНу допустим, пользователь по конкретному контракту только 1, в смысле если я ввожу данные по одному контракту, то никто параллельно в этот момент не работает с данным контрактам. Соответственно, исключаем возможность других сеансов по конкретной записи. Или другой пример. Допустим я единственный пользователь базы.Такие допущения надо чем-то обеспечить studierenПочему то в MS SQL Server нет таких проблем вообще.Просто они разные Когда ты изменяешь несколько строк одним оператором и пытаешься (в триггере для каждой обновленной строки) например, подсчитать сумму в этих строках, то возникает вопрос, на какой момент времени брать значения? Точнее даже какой именно из возможных -- ты не можешь управлять порядком обновления/удаления/вставки строк (при многострочной обработке) и при другом порядке (который выбирает Oracle) результат будет другой. Возьмем твой пример -- ограничить сумму в 1500 Пусть у нас есть строки со значениями: 1000, 500, -1000 Если мы сделаем UPDATE TABLE SET AMOUNT = AMOUNT*3 То, если строки будут обновляться в прямом порядке, то после обновления первой строки мы получим (1000*3)+(500)+(-1000) = 2500, что уже больше 1500, и значит все плохо, так делать нельзя и т.п. Если же мы обновляем с конца, то после обновления всех строк получаем (1000*3)+(500*3)+(-1000*3) = 1500, что оказывается неплохо, можно даже сказать, хорошо Вот от такой неоднозначности тебя Oracle и страхует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 12:51 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Дык он студент вроде, кто знает, что он там напишет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 12:56 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenВ MS SQL Server с одной таблицей могут работать сразу несколько пользователей и при этом триггер спокойно видит все сохранённые данные. Уверен? Проверь на своей схеме следующий сценарий: 1) Сессия 1 стартует транзакцию 2) Сессия 2 стартует транзакцию. 3) Сессия 1 добавляет к документу строку, полностью выбирающую лимит. 4) Сессия 2 добавляет к тому же документу вторую строку, полностью выбирающую лимит. 5) Сессия 1 коммитится. 6) Сессия 2 коммитится. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 13:05 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
пардон, если баян - тему читал по оч. большой диагонали studieren, в sql оракловом есть несколько функций каждой из которых достаточно, для создания подходящего вашей теме проверочного констрейнта например, ltrim(ляля,'0123456789') is null ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 13:51 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
orawishпардон, если баян - тему читал по оч. большой диагонали studieren, в sql оракловом есть несколько функций каждой из которых достаточно, для создания подходящего вашей теме проверочного констрейнта например, ltrim(ляля,'0123456789') is null Ту проблема я уже решил с помощью regexp_like (спасибо товарищам за подсказку). Теперь у меня совсем другая проблема. Когда пользователь правит какую-либо таблицу (мутирующая таблица), то мне необходимо ставить такое ограничение, которое проверяет все записи мутирующей таблицы и если что не так, то запрещает внесение изменений. При этом даже если предположить, что где-то другой пользователь пытается внести изменение в данную таблицу, то эти изменения игнорировать если данные фактически ещё НЕ СОХРАНЕНЫ! Как это сделать? Не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 15:10 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров... Возьмем твой пример -- ограничить сумму в 1500 Пусть у нас есть строки со значениями: 1000, 500, -1000 Если мы сделаем UPDATE TABLE SET AMOUNT = AMOUNT*3 То, если строки будут обновляться в прямом порядке, то после обновления первой строки мы получим (1000*3)+(500)+(-1000) = 2500, что уже больше 1500, и значит все плохо, так делать нельзя и т.п. Если же мы обновляем с конца, то после обновления всех строк получаем (1000*3)+(500*3)+(-1000*3) = 1500, что оказывается неплохо, можно даже сказать, хорошо Вот от такой неоднозначности тебя Oracle и страхует В MS SQL Server когда массово что-то меняете и при этом хотя бы одна запись даёт "сбой", то сервер запрещает все изменения и происходит откат. Жаль, что в ORACLE не так. А вообще обычно юзеры штучно правят записи, массово что-то менять может только админ базы или специалист ИТ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 15:16 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenВячеслав Любомудров... Возьмем твой пример -- ограничить сумму в 1500 Пусть у нас есть строки со значениями: 1000, 500, -1000 Если мы сделаем UPDATE TABLE SET AMOUNT = AMOUNT*3 То, если строки будут обновляться в прямом порядке, то после обновления первой строки мы получим (1000*3)+(500)+(-1000) = 2500, что уже больше 1500, и значит все плохо, так делать нельзя и т.п. Если же мы обновляем с конца, то после обновления всех строк получаем (1000*3)+(500*3)+(-1000*3) = 1500, что оказывается неплохо, можно даже сказать, хорошо Вот от такой неоднозначности тебя Oracle и страхует В MS SQL Server когда массово что-то меняете и при этом хотя бы одна запись даёт "сбой", то сервер запрещает все изменения и происходит откат. Жаль, что в ORACLE не так. А вообще обычно юзеры штучно правят записи, массово что-то менять может только админ базы или специалист ИТ. ты откуда ж такого фееричного бреда понабрал-то... а про мутирующие таблицы тебе уже 2 страницы разжевывают. пишет и пишет, говорят ему доку открой, "ну-не-пойму-я" заклинило :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 15:38 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenВячеслав Любомудров... Возьмем твой пример -- ограничить сумму в 1500 Пусть у нас есть строки со значениями: 1000, 500, -1000 Если мы сделаем UPDATE TABLE SET AMOUNT = AMOUNT*3 То, если строки будут обновляться в прямом порядке, то после обновления первой строки мы получим (1000*3)+(500)+(-1000) = 2500, что уже больше 1500, и значит все плохо, так делать нельзя и т.п. Если же мы обновляем с конца, то после обновления всех строк получаем (1000*3)+(500*3)+(-1000*3) = 1500, что оказывается неплохо, можно даже сказать, хорошо Вот от такой неоднозначности тебя Oracle и страхует В MS SQL Server когда массово что-то меняете и при этом хотя бы одна запись даёт "сбой", то сервер запрещает все изменения и происходит откат. Жаль, что в ORACLE не так. Ты нихрена не понял Вопрос в непредсказуемости результата studierenА вообще обычно юзеры штучно правят записи, массово что-то менять может только админ базы или специалист ИТ.Какое-то извращенное понятие, можно подумать БД разбирается -- обычный это юзер или "специалист ИТ" На одиночных обновлениях триггер BEFORE ... FOR EACH ROW тоже отработает без ошибки Именно потому, что результат детерминирован ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 15:44 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenВ MS SQL Server когда массово что-то меняете и при этом хотя бы одна запись даёт "сбой", то сервер запрещает все изменения и происходит откат. Вот только твой триггер не даст "сбой". Сценарий я описал выше. Триггерами можно обеспечить целостность группы записей только на уровне изоляции DIRTY READ. Которого в Oracle нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 15:51 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovТриггерами можно обеспечить целостность группы записей только на уровне изоляции DIRTY READ. Которого в Oracle нет. целостность и dirty read. целостность можно обеспечить при любом уровне изоляции, кроме dirty read. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:00 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, ОК. Вот ещё одна проблема. Я должен хранить серийные номера "от" и "до" в разных полях/столбцах. При этом серийные номера не в коем случае не должны пересекаться. Скажем, в таблице есть такие данные: От До1 1020 30 Если я попытаюсь ввести диапазон 7 и 11 программа должна ругаться, так как внутри диапазона 1 и 10 уже есть хотя бы как минимум 1 элемент из 7 и 10. Неужели в ORACLE я не смогу создать такой запрет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:05 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenНеужели в ORACLE я не смогу создать такой запрет? Сможешь. Но работать правильно он будет исключительно в однопользовательском режиме. Как и в любой другой СУБД кроме тех, которые выше DIRTY READ ничего не умеют. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:12 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenТ.е. пусть даже триггер не видит, что делают другие пользователи, а имеет дело только с конкретным пользователем. В этом то вся и проблема. В этом самом конкретном пользователе. Другие фиг с ними - он не закоммитились - их нет. Oracle версионник. А это значит, что он не возвращает данные, которые есть в базе. Он возвращает данные на какой-то момент времени (иногда оп выбору иногда на усмотрение сервера). Основная операция еще не завершилась - поэтому ее результата еще нет. И в том числе для триггера. Если так сделать Вы же первый взвоете - какого черта? Ну и в большинстве случаев подобный подход, когда проверяется верность несогласованного набора данных, чаще всего нужно тем, кто хочет совершить ошибку. Поэтому Oraclke СУБД и выплевывает ошибку в этот момент. Простой пример. Вы всегда хотите, чтобы сумма чего-то разложенного по полкам была равна константе. Тогда Вы не сможете одной операцией увеличить значение на одной полке и уменьшить на другой, если будете проверять сумму по ходу операции. Для этого надо проверять сумму после операции. О чем и сигнализирует ошибка. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:20 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenНеужели в ORACLE я не смогу создать такой запрет? Можешь. Но делается это иначе. Делается мат вью, которое возвращает количество пересекающихся интервалов, обновляемое по commit. И constraint который не позволяет количеству пересекающихся интервалов быть больше 0. Одна проверка на транзакцию. Не на каждое изменение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:25 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Ну или iot табличку с уникальными номерами (вставляем для всего диапазона). Заодно можно получить отлуп (взаимная блокировка), если кто-то еще пытается вместе с вами работать в том же направлении. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:30 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНа одиночных обновлениях триггер BEFORE ... FOR EACH ROW тоже отработает без ошибкиВставках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:31 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
ElicВячеслав ЛюбомудровНа одиночных обновлениях триггер BEFORE ... FOR EACH ROW тоже отработает без ошибкиВставках.Упс... Точно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2016, 16:43 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Прочёл книжку "ORACLE PL/SQL Как писать мощные и гибкие программы на PL/SQL" Кристофер Аллен. Там нашёл ответ на свою проблему. Вот отрывок: Когда триггер пытается прочитать таблицу, а затем записать в нее данные, возбуждается исключение "мутирующей таблицы". Хотя намерение ограничить действия такого типа вполне объяснимо, корпорация Oracle зашла в этом дальше, чем необходимо, запретив операции, при которых таблица просто блокируется, а не изменяется. Один из способов обойти эту проблему заключается в том, чтобы создать вторую таблицу с копиями столбцов, которые триггер должен прочитать из главной таблицы. В этом случае триггер получает необходимые значения из второй таблицы, а затем выполняет запланированные действия с первой таблицей. При реализации данного подхода важно обеспечить синхронизацию таблиц. Для этого все операции INSERT, UPDATE и DELETE над главной таблицей должны отражаться триггером на второй таблице. Т.е. создаю таблицу точь в точь с "оригиналом", туда добавляю все изменения (вставка, изменение, удаление). Все необходимые мне проверки провожу во второй таблице. Ну если это единственный способ, что поделать! Буду так. Но я в шоке от корпорации ORACLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 09:19 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenНу если это единственный способ, что поделать! В FAQ написано, как использовать коллекции из пакета, а отнюдь не отдельную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 09:28 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
tru55studierenНу если это единственный способ, что поделать! В FAQ написано, как использовать коллекции из пакета, а отнюдь не отдельную таблицу. Не смог осилить. Можете простенький пример показать? Да хоть в примере "контракты" и "платежи". Мне показалось, что там в FAQ не мой случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 09:36 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenНе смог осилить. Можете простенький пример показать? Да хоть в примере "контракты" и "платежи". Мне показалось, что там в FAQ не мой случай. простенький пример из документации Example 9-10 Compound Trigger Avoids Mutating-Table Error\ Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 10:04 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, С подходом чтения изменяемой таблицы в триггере этого не решить без блокировки мастер-ключа. У dbms_lock свои недостатки при интенсивном использовании большого количества значений, да еще коммит на аллокейт. Можно, конечно, эксклюзивить всю таблицу. Посему, в оракле предпочитают использовать более оракловые подходы ограничения агрегатов промеж строк. Или вообще не ограничивать на стороне БД. Мало ли, какие еще нереляционные сложносвязанные бизнес-требования могут применяться в приложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 10:13 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenВячеслав Любомудров,Не очень понятно, почему ты мне это адресуешь studierenПрочёл книжку "ORACLE PL/SQL Как писать мощные и гибкие программы на PL/SQL" Кристофер Аллен.Судя по написаному, читать такое не стоит studierenНу если это единственный способ, что поделать! Буду так. Но я в шоке от корпорации ORACLE.Это самый извращенный способ, мне, честно говоря, и в голову такое прийти не могло (правда, я не разработчик). По-поводу шока, ты так и не сказал, как нужно вести себя (твое ограничение в 1500 на сумму платежей) я использую все тот же пример Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. Обновляем несколько строк Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Просто добавили индекс Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. PS. А как себя поведет MS SQL? Точнее, как там разруливаются такие ситуации -- зависимость результата от порядка обработки Или ты просто никогда не задумывался над этим? А Оракл за тебя подумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 10:35 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровstudierenВячеслав Любомудров,Не очень понятно, почему ты мне это адресуешь Извиняюсь, я просто нажал "Ответить", а т.к. последнее сообщение было Ваше, Ваше имя и осталось. Сорри, не удалил. Вячеслав ЛюбомудровPS. А как себя поведет MS SQL? Точнее, как там разруливаются такие ситуации -- зависимость результата от порядка обработки Или ты просто никогда не задумывался над этим? А Оракл за тебя подумал Да там Все просто. Когда в одно и то же время меняете 2 и более записей (разумеется и там порядок изменений не имеет значений) и если хотя бы в одной записи "осечка", то сервер не даст сохранить всем изменениям. Поэтому всё работает чётко как запланировано разработчиком БД. Да, кстати, там триггер не работает по принципу "FOR EACH ROW", там такого нет. Всё целиком, все записи одновременно. Любые изменения будут в логической таблице "Inserted", а удалённые в "Deleted". Если нужно узнать новое и удаленное значение, то выдёргиваем из этих таблиц. Как то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 13:27 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenКогда в одно и то же время меняете 2 и более записей (разумеется и там порядок изменений не имеет значений) и если хотя бы в одной записи "осечка", то сервер не даст сохранить всем изменениям. Так нет никакой "осечки". Всё отлично вставляется и модифицируется из параллельных коннектов. Но твоё ограничение при этом - нарушается. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 17:36 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Приветствую форумчан! Вопрос № 1. Есть поле "LastModifiedDate", где необходимо сохранить последнюю дату и время обновления каждой записи. Если ввести новую запись, то достаточно в значение по умолчанию указать SYSDATE. А как в триггере надо написать, чтобы ORACLE не ругался на мутирующую таблицу во время обновления записи? Пробовал разные варианты, но почему то ORACLE ругается. Вопрос № 2. В MS SQL Server при обновлении записи я мог использовать CTE, что-то вроде этого: Код: sql 1. 2. 3. 4. 5. 6. Но как я понимаю, в ORACLE такое не пойдёт. Пробовал вот так. Код: plsql 1. 2. 3. Работать то конечно работает, но оооооочень медленно! Разумеется запрос на обновление не самое оптимальное. Но а как ускорить / оптимизировать запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 08:55 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenА как в триггере надо написать, чтобы ORACLE не ругался на мутирующую таблицу во время обновления записи?RTFM DML Triggers: Correlation Names and Pseudorecords (FAQ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2016, 09:09 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Добрый день! Как сделать уникальным все непустые значения поля "А" в таблице "Table1" в Oracle? В MS SQl Server можно создать уникальный индекс с фильтром. Что-то вроде этого: Код: sql 1. После этого сервер не позволяет дублировать НЕ пустые значения. А вот если поле "А" не заполнено пользователем, то сервер сколько угодно записей может сохранить без проблем. Мне нужно тоже самое и в ORACLE. Пожалуйста, подскажите куда рыть. Спасибо заранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 08:25 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, просто создай уникальный индекс. и всё. работать будет именно так, как ты хочешь: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 08:37 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Прошу прошения я неправильно написал. У меня в реальной базе индекс состоит из 2 полей. Код: sql 1. Поле "B" обязательное, поэтому там пустое значение не может быть. Не думал, что ORACLE допускает ввод пустых значений, если индекс состоит из одного поля. Может мне создать "Function-based index", где конкатенирую 2 поля и полученное значение попробую сделать уникальным? Сейчас попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 09:02 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Вроде бы получилось! :) Спасибо за подсказку. Правда получился дурацкий индекс, которого не буду использовать в запросах. Он будет служить только как ограничение. Ну а если у гуру есть более продвинутая идея, буду рад любым подсказкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 09:09 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenболее продвинутая идея Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 09:21 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Elic, Thank you very much! Работает однако! Взял на вооружение. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 09:44 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenКак сделать уникальным все непустые значения поля "А" в таблице "Table1" в Oracle? В MS SQl Server можно создать уникальный индекс с фильтром. Что-то вроде этого: Код: sql 1. После этого сервер не позволяет дублировать НЕ пустые значения. А вот если поле "А" не заполнено пользователем, то сервер сколько угодно записей может сохранить без проблем.null, он даже в mssql null. Неужели без этого условия mssql запрещает вставлять несколько null? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 11:52 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
-2-studierenКак сделать уникальным все непустые значения поля "А" в таблице "Table1" в Oracle? В MS SQl Server можно создать уникальный индекс с фильтром. Что-то вроде этого: Код: sql 1. После этого сервер не позволяет дублировать НЕ пустые значения. А вот если поле "А" не заполнено пользователем, то сервер сколько угодно записей может сохранить без проблем.null, он даже в mssql null. Неужели без этого условия mssql запрещает вставлять несколько null? Да, запрещает. В принципе я согласен с таким положением дел. Вот к примеру ORACLE также запрещает, но только если уникальный индекс состоит как минимум из 2 полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 16:38 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, ну и в оракле вы можете и над одной колонкой сделать fbi, который обеспечит желаемое. другое дело, что обычно атрибут такой создают обязательным и проблемы нет в принципе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2016, 17:17 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Очередной вопрос. Разве в Oracle нет пустой строки ''? Код: plsql 1. 2. 3. Получается проверять длину строки на 0 не имеет смысла? Я имею ввиду вот такое сравнение: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 08:02 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 08:31 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenПолучается проверять длину строки на 0 не имеет смысла? Я имею ввиду вот такое сравнение: Код: sql 1. Примите в расчет - здесь вам не BSTR. Проблема не там, где length вернет Null вместо ожидавшегося вами 0, а, наоборот, вовсе там, где он трудолюбиво займется вычислениями ее длины для непустой строки. В отличии от BSTR, где length просто читает префикс строки, здесь вы наступаете на алгоритм сложности порядка длины строки, с коэффициентом на алгоритм определения длины следующего символа для кодировок типа utf8. Просто выбросьте из головы length до тех пор, пока он вам жизненно не понадобится. А в оставшихся случаях пользуйтесь им предельно экономно, т.к. вы точно знаете, что вы за рамками BSTR. studierenПриветствую всех. Очередной вопрос. Разве в Oracle нет пустой строки ''? Код: plsql 1. 2. 3. Нет в том смысле, в каком ее длина ожидается равной нулю. Так же, как симметрично, нет строкового +, обращающего в Null результат, если один из операндов Null. Конкатенация всегда работает как &. В документации тщательно оговаривается возможность изменения поведения в будущем. Имхо, даже если так, то будущая вероятная "опасность" подстерегает только злоупотребляющих ANSI-формулировками для имен типов. Не могу сказать, что таких борцов за переносимость не может быть, но своими глазами не только видел, но искренне надеюсь уже и не увидеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 15:29 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Очередная проблема. Есть поле в SQL Server varchar(8000). Т.к. в ORACLE максимальная длина 4000, пришлось мне создать 2 поля с типом данных Varchar2(4000). Далее, создал виртуальное поле, которое соединяет эти поля. Но не тут то было. Оказывается при конкатенации ORACLE всё равно ругается, если общая длина строк превышает 4000. Как мне быть? Есть способ как то обойти данное ограничение? Спасибо заранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2016, 15:23 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenКак мне быть? Use CLOB, Luke! Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2016, 15:33 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, на 12c нет лимита 4000 байт на varchar2 столбцах на серверах < 12с есть, например, тип CLOB короче, Как мне быть? читайте.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2016, 15:40 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Спасибки! Вроде бы получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2016, 15:40 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Уважаемые форумчани, у меня снова возникла проблема. Есть простейший запрос в MS SQL Server, необходимо перевести его в ORACLE: Код: sql 1. 2. 3. Что делает этот запрос? Допустим "Table1" главная таблица, а "Table2" подчинённая. Подзапрос (отмеченный красным цветом) перечисляет через запятой все коды торговых точек в одной так сказать "ячейке". Как это сделать в ORACLE? Мне бы синтаксис. Хотел погуглить, но не знаю как объяснить гуглу что хочу искать. :) Попробовал искать "конкатенация", но гугл даёт совсем не то, что хочу. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 12:47 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenперечисляет через запятой все коды торговых точек в одной так сказать "ячейке".RTFM LISTAGG ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 12:52 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Elic, Thanks!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 14:50 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Очередной вопрос. В начале я создал юзера, чтобы создать параллельно схему что-то вроде этого: Код: plsql 1. Создал несколько объектов для данной схемы. А как добавить пароль юзеру "dbo"? Как я понимаю, я могу удалить юзера и заново создать так как надо. Но его удалить мне не нужно, т.к. я потеряю все его объекта. Можно ли добавить пароля не пересоздав юзера в ORACLE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 10:37 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenМожно ли добавить паролячтоб добавить пароля, нужно кодить до ... прочесть sqlя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 11:32 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenне пересоздавВ этом грёбаном MS нет ALTER?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 11:48 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Что-то про ALTER USER не подумал. Сорри. Получилось. Код: plsql 1. Только вот при подключении ругается ORA-01045: user lacks CREATE SESSION privilege; logon denied ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 12:01 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenuser lacks CREATE SESSIONИ GRANT-а тоже нет?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 12:13 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Elic, А что надо написать вместо "X" и "Y"? Код: sql 1. Что означает здесь "X"? А как узнать какие роли есть в базе? Как-нибудь список можно вытащить? Я ещё не успел создать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 12:31 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Форумом Oracle не выучишь. Читай документацию, наглец. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 12:40 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Приветствую форумчан! Я в MS SQL Server при обновлении UPDATE использовал FROM, а там и INNER JOIN. Вот примерчик: Код: sql 1. 2. 3. 4. 5. Увы, в ORACLE такая конструкция не работает. Попробовал вот так. Код: plsql 1. 2. 3. 4. 5. Вроде бы работает, но на практике оказалось, что чрезвычайно капризная конструкция. Часто ругается, что не может так. Приходится выкручиваться вот таким образом: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Конечно работать то работает, но у меня в таблице порядка больше миллиона записей, поэтому "двойной" подзапрос, т.е. и в SELECTе, и в WHERE работает невозможно медленно! Просто невыносимо! То, что в MS SQL Server обновляется буквально за 5-10 минут, в ORACLE уходит часы. Может есть идея как-нибудь улучшить запрос на обновление? Оптимизировать как-то? Есть ещё какая-нибудь более лучшая конструкция? Спасибо заранее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 11:09 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenна практике оказалосьне надоело делать абы как, методом тыка разве что дети родятся. Но их ведь еще вырастить надо. С 2010, задавая "Вопросы начинающего" уже можно было освоить документацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 12:31 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studierenЕсть ещё какая-нибудь более лучшая конструкция? MERGE Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 12:41 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Спасибки! Реально помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 08:36 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, что опять задаю вопрос про MERGE. Как с помощью MERGE удалить записи, но при этом не обновлять записи? Вот здесь FAQ есть такой примерчик: Код: plsql 1. 2. 3. 4. 5. 6. 7. Но мне не нужно обновлять. Попробовал убрать "UPDATE SET ...". ORACLE ругается: ORA-00905: missing keyword Прочёл несколько раз документацию, но так и не понял как надо правильно написать. Вот так не получается. Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 13:10 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, delete. не надо забивать микроскопом гвозди. удаляй предназначенным для этого инструментом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 13:27 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Вот здесь 12105899 пишут, что DELETE без UPDATE не бывает. Печально! Ну выкрутился так: Код: plsql 1. 2. 3. 4. 5. 6. Т.е. включил бестолковую инструкцию "UPDATE SET T.Любое_поле = T.Любое_поле" и вроде бы заработало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 13:28 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
Vintstudieren, delete. не надо забивать микроскопом гвозди. удаляй предназначенным для этого инструментом. А как удалить данные сравнивая 2 таблицы? Конечно можно в условие WHERE EXISTS как-нибудь включить подзапрос, но тогда работает оооооочень медленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 13:31 |
|
||
|
Перевод из MS SQL Server в ORACLE
|
|||
|---|---|---|---|
|
#18+
studieren, Жги дальше. Жду вопросов на автофоруме "Раньше у меня был ваз 2104, и я чистил карбюратор ветошью. Как почистить ветошью инжектор?" MERGE statement Specify the DELETE where_clause to clean up data in a table while populating or updating it. The only rows affected by this clause are those rows in the destination table that are updated by the merge operation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 13:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1886761]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
157ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
127ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 522ms |

| 0 / 0 |
