|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
Вопрос вроде бы простой.. Есть одна специфическая таблица, в которую оптимальным решением было бы делать MERGE, однако есть необходимость возвратить значение одного из столбцов после dml-операции. Однако RETURNING INTO в MERGE насколько я понимаю не поддерживается, в итоге все бонусы использования MERGE улетучиваются т.к. придется делать еще один запрос после операции чтобы выяснить значение столбца. С другой стороны, убирать MERGE, и делать вместо него первоначальный запрос с целью определения следующей операции (INSERT, UPDATE) тоже не хочется. Можно ли найти какой-то компромисс, или придется смириться с неизбежностью ввиду отсутствия подходящего синтаксиса? =) Версия 9.2.0.6 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 11:50 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
Скажите, а КАКОЕ множество строк Вы хотели бы видеть в RETURNING Проапдейченное или проинсерченное ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 12:21 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
Может сделать триггер и заполнять пакетные переменные. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 12:24 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
заполнить в триггере массив? Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 12:24 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
2Gluk(Kazan) Имелась в виду фраза типа MERGE... ... WHEN MATCHED THEN UPDATE ... RETURNING ... INTO ... WHEN NOT MATCHED THEN INSERT ... RETURNING ... INTO ... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 12:27 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
Попробуй триггер create table t ( n number ); -- Глобальный пакет для управления функцией и сбора результатов create package pkg as enable_log boolean := false; -- Сбор изменений отключен log_rowid dbms_sql.urowid_table; log_op dbms_sql.varchar2_table; end; / create trigger t_t after insert or update on t for each row declare i binary_integer; begin if pkg.enable_log then i := nvl(pkg.log_rowid.last+1, 1); pkg.log_rowid(i) := :new.rowid; if inserting then pkg.log_op(i) := 'I'; else pkg.log_op(i) := 'U'; end if; end if; end; / exec pkg.enable_log := true insert into t values (1); update t set n = n+1; -- Получаем список rowid изменённых строк exec for i in 1..pkg.log_rowid.last loop dbms_output.put_line(pkg.log_rowid(i)); end loop; Jl1rADmAAAijWAAA Jl1rADmAAAijWAAA -- Получаем список операций exec for i in 1..pkg.log_rowid.last loop dbms_output.put_line(pkg.log_op(i)); end loop; I U -- Убираем за собой exec pkg.enable_log := false exec pkg.log_rowid.delete exec pkg.log_op.delete ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 12:42 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
mcureenab -- Глобальный пакет Я бы сказал ГАЛЛАКТИЧЕСКИЙ :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 12:57 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
Спасибо за триггерно-пакетную реализацию, но так делать не хотелось бы. Таблица и так в режиме мультимастер-репликации находится, содержит данные с нескольких узлов (кстати, поэтому делать DML по ROWID не совсем корректно, т.к. уникальность ROWID гарантируется лишь на уровне экземпляра БД а не всей системы баз, связанных репликацией). Так что лишнего усложнения программной логики таблицы не хотелось бы.. Похоже придется остановиться на простом варианте с IF THEN INSERT ELSE UPDATE END IF. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 15:28 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
TramplerСпасибо за триггерно-пакетную реализацию, но так делать не хотелось бы. [...] Похоже придется остановиться на простом варианте с IF THEN INSERT ELSE UPDATE END IF. На один проход меньше, чем в варианте "select... if-then-insert-else-update": Код: plaintext 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. 77. 78. 79. 80. 81. 82. 83.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 19:41 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
Да, забыл сказать - вариант для 9i. В 10g цикл "сжатия" промежуточного массива - лишний. Как и массивы src_ins_* ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2005, 19:44 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
andrey_anonymousДа, забыл сказать - вариант для 9i. В 10g цикл "сжатия" промежуточного массива - лишний. Как и массивы src_ins_* как? через save exception но там (все равно нужен массив)? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2007, 18:35 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
bgn andrey_anonymousДа, забыл сказать - вариант для 9i. В 10g цикл "сжатия" промежуточного массива - лишний. Как и массивы src_ins_* как? через save exception но там (все равно нужен массив)? Пусть andrey_anonymous меня поправит (погрузился в тему не до дна), но мне кажется , что он имеет в виду новую вариацию FORALL FORALL Statement: INDICES OF- Clause ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2007, 14:52 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
Код: plaintext 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.
у меня, с клиента в цикле вставляются записи в запись массивов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
По скорости с merge выйграл %30-40, но можно ли еще? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2007, 16:28 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
блин касяк в не обновлялось (сам же удалял) получилоси только так Код: plaintext 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.
как без дополнительного массива обойтись (можно конечно удалять те записи которых нет в sql%bulk_exceptions(i).error_index, но кажется это будет дольше, вложенные цыклы придется делать)? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2007, 18:47 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
УРА, вот, что получилось Код: plaintext 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.
тест Код: plaintext 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.
на разных клонах таблицы ROUTE_LIST (со всеми ключами и индексами) вариант с save exceptions(SetRouteListFromArray), раз в 7 проиграл SetRouteListFromArray2, а про простой merge или if .. insert .. update вобще молчу. Заливаются записи теперь со свистом ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2007, 10:15 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
коллеги ничего не поменялось? не появился returning в merge? ms сделал уже Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:46 |
|
MERGE и RETURNING INTO
|
|||
---|---|---|---|
#18+
andreymx, У ms конструкция output с давних времен, как и служебные таблицы inserted, deleted ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 14:56 |
|
|
start [/forum/topic.php?fid=52&fpage=37&tid=1880904]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 152ms |
0 / 0 |