|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Oracle 19.3.0.0.0 Приветствую, я в шоке, такого точно не было в Oracle 9. Это баг? Итак, Oracle 19.3.0.0.0 Есть таблица, в которой поле (IsDeleted) при выставлении его в "1" должно в том числе заставлять UNIQUE-индекс игнорировать данную строчку таблицы. Так вот, при INSERT новой строки в таблицу проверка работает, но при UPDATE проверка перестала в Oracle 19 работать, если индекс определён с использованием decode, но работает при использовании CASE Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
при UPDATE правильно работает при использовании CASE в описании индекса Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
при UPDATE неправильно работает при использовании DECODE в описании индекса Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
И вот что получаем: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:07 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Кроик Семёнdecode(IsDeleted, А теперь вопрос на засыпку: это IsDeleted из контекста NEW или OLD? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:16 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, разве индекс не для NEW? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:18 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Кроик Семёнразве индекс не для NEW? Да, пожалуй. Походу, я его с CHECK CONSTRAINT перепутал. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:22 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#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.
P.S. В рамках SR'а лет 8 назад поддержка рекомендовала отказываться от decode в пользу case (мол, "эти баги низкоприоритетные", "скоро decode на пенсию отправят"). Но вроде жив еще курилка. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:29 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Кроик Семён, а если? decode(IsDeleted, 1, cast(NULL as date) , trunc(AnyDate)) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:32 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Stax , классно, decode()+CAST заработало. Спасибо Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:43 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Asmodeus Version 19.12.0.0.0 ... ORA-00001 Похоже, где-то в середине поправили таки баг был значит, спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 16:44 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Кроик Семён таки баг был значит, спасибо Да не баг это а твое не RTFM. Тип результата decode есть тип первого decoded expression - у тебя NULL. NULL не имеет типа. Oracle решил что в ситуациях когда необходим тип выражения а выражение NULL (не путать со значением выражения равным NULL) считать тип VARCHAR2. Посему: Код: plsql 1. 2. 3.
вернет TO_CHAR(trunc(AnyDate),<instance NLS_DATE_FORMAT>). Код: 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.
По идее Oracle должен бы выругаться и не дать создать NLS зависимый индекс. Возможно он инвалидирует индекс при изменении instance NLS_DATE_FORMAT, не пробовал. В любом случае - индекс завязанный на неявные преобразования рано или поздно выстрелит. Так-что CAST(NULL AS DATE) решает все эти проблемы. И это не зависит от DECODE/CASE. Тип результата case также есть тип первого case expression. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 20:21 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SYвернет TO_CHAR(trunc(AnyDate),<instance NLS_DATE_FORMAT>). Это не правда. Будет использован database NLS_DATE_FORMAT, что пример и продемонстрировал. SYВозможно он инвалидирует индекс при изменении instance NLS_DATE_FORMAT, не пробовал. Oracle так не будет делать. SYИ это не зависит от DECODE/CASE. Тип результата case также есть тип первого case expression. От DECODE и CASE зависит. CASE работает несколько иначе в определении типов данных и для приведенного примера тип данных CASE будет DATE. Код: 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.
Очевидно, случился выстрел в ногу. Это баг. Чтобы понять, что происходит, нужно посмотреть небольшой пример. Код: 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. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197.
Здесь наиболее интересен дамп индекса, который объясняет, почему Oracle пропустил update: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Пока все похоже на то, что без явного формата: 1. Oracle использует database NLS_DATE_FORMAT при построении индекса 2. при INSERT/UPDATE - использует NLS_DATE_FORMAT сессии. Например, можно закомментировать UPDATE и INSERT пройдет, что будет 2 строки и произойдет ситуация, которая никогда не должна происходить: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
3. при rebuild Oracle корректно определяет, что есть duplicate keys: Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2022, 22:39 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
классный разбор ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 01:02 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SeaGate Будет использован database NLS_DATE_FORMAT, что пример и продемонстрировал. Похоже берет из сессии: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Создаем таблицу с двумя записями где даты разнятся > 1 секунды и затем создаем уникальный индекс: Код: 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.
Как видим да, не instance как как instance NLS_DATE_FORMAT='mm/dd/yyyy hh24:mi:ss' т.е. до секунд. Теперь тоже самое но даты разнятся > 1 минуты: Код: 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.
Индекс создался - значит не database как как database NLS_DATE_FORMAT='DD-MON-RR' т.е. до дня. Так-что похоже мы оба промахнулись и используется session NLS_DATE_FORMAT. SeaGate От DECODE и CASE зависит. CASE работает несколько иначе в определении типов данных и для приведенного примера тип данных CASE будет DATE. Проверил, таки да. И тогда это либо баг в CASE либо баг в доке, ибо CASE Expressions глаголит: For both simple and searched CASE expressions, all of the return_exprs must either have the same data type (CHAR, VARCHAR2, NCHAR, or NVARCHAR2, NUMBER, BINARY_FLOAT, or BINARY_DOUBLE) or must all have a numeric data type. If all return expressions have a numeric data type, then Oracle determines the argument with the highest numeric precedence, implicitly converts the remaining arguments to that data type, and returns that data type. А поскольку NULL datatype есть VARCHAR2, то согласно доке Код: plsql 1. 2. 3. 4.
Oracle должен бы выругаться. Пример показывающий тип NULL: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Кстати у VARCHAR2 нет длины - похоже еще один баг :). SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 01:42 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Если я правильно понял то что вы написали, это сводится к такому тест кейсу test Код: 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.
output Код: 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. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109.
похоже на жука ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 02:15 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Все можно было проверить куда проще : Код: plsql 1. 2. 3. 4. 5. 6. 7.
Так-что: 1. мы оба промахнулись и используется session NLS_DATE_FORMAT. 2. при INSERT/UPDATE - использует NLS_DATE_FORMAT сессии - тоже нет, т.к. неявное преобразование использующее session NLS_DATE_FORMAT на момент создания индекса закрепляется в COLUMN_EXPRESSION и становится явным для всех последующих действий. Но все равно я бы предпочел чтобы Oracle ругнулся на создание FBI с неявным преобразованием. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 02:15 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Alexander Anokhin Если я правильно понял то что вы написали, это сводится к такому тест кейсу test Код: 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.
output Код: 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. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109.
похоже на жука немного короче Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 02:37 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY я бы предпочел чтобы Oracle ругнулся на создание FBI с неявным преобразованием даже такие Код: 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.
По поводу "умного" case: можно уточнить, что тип берется из первого не-нуллового expression Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 02:45 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Alexander Anokhin Alexander Anokhin Если я правильно понял то что вы написали, это сводится к такому тест кейсу test Код: 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.
output Код: 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. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109.
похоже на жука немного короче Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Забыл уточнить, что тест (выше) требует Код: plsql 1.
Без этого тест кейс мог быть такой Код: 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.
Посмотрю поглубже на днях и заведу багу, если это баг. Пока выглядит как баг. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 04:31 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan Malakshinov По поводу "умного" case: можно уточнить, что тип берется из первого не-нуллового expression Это эмпирика не отраженная в доке посему IMHO либо баг в CASE либо баг в доке. И во избежание сюрпризов в следующих версиях я бы использовал CAST/TO_DATE/TO_NUMBER... т.е. никаких неявностей. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 14:13 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SYЭто эмпирика не отраженная в доке А не предписывается ли это ANSI стандартом?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 14:22 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY Это эмпирика не отраженная в доке посему IMHO либо баг в CASE либо баг в доке. Код: plsql 1. 2. 3. 4. 5. 6.
Код: plsql 1. 2. 3. 4. 5. 6.
SY я бы использовал CAST/TO_DATE/TO_NUMBER... т.е. никаких неявностей. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 16:25 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY А поскольку NULL datatype есть VARCHAR2 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 18:54 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY Пример показывающий тип NULL SY эмпирика не отраженная в доке SY Кстати у VARCHAR2 нет длины - похоже еще один баг :). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 19:02 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan Malakshinov то, что при `create view as select null x from dual` x определен как varchar2(0) не значит, что NULL имеет тип Null- значения в оракеле вполне себе типизованные. Неопределенность возникает лишь при выводе типа из null- литерала . Поскольку логически эта проблема неразрешима без разделения самих null-литералов на типы - в качестве default выбран относительно универсальный тип varchar2. Это надо просто помнить :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2022, 19:02 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
andrey_anonymous Null- значения в оракеле вполне себе типизованные. andrey_anonymous Неопределенность возникает лишь при выводе типа из null- литерала . andrey_anonymous Поскольку логически эта проблема неразрешима без разделения самих null-литералов на типы - в качестве default выбран относительно универсальный тип varchar2. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2022, 20:06 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
andrey_anonymous Это надо просто помнить :) Нет в Oracle NULL литералов. Есть NULL expressions: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2022, 20:18 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY Нет в Oracle NULL литералов. Есть NULL expressions Вы правы, Соломон, прошу прощения за терминологическую неточность. К моей удаче, в данном конкретном случае на тезис не влияет. Sayan Malakshinov andrey_anonymous Null- значения в оракеле вполне себе типизованные. Предлагаю не путать тёплое с мягким... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Или, быть может, так будет понятнее: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
И хотя, казалось бы: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
и при этом Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Однако: Код: plsql 1. 2. 3. 4. 5.
Sayan Malakshinov andrey_anonymous Неопределенность возникает лишь при выводе типа из null- литерала . Минимальный пример: Код: plsql 1.
Sayan Malakshinov почему это проблема? Sayan Malakshinov Если это проблема - то почему она неразрешима без разделения NULL-литералов на типы? Sayan Malakshinov Например, введение для ясности отдельного NULL data type Вот тут вообще не понял что имелось ввиду. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2022, 21:47 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
andrey_anonymous Предлагаю не путать тёплое с мягким... andrey_anonymous Код: plsql 1. 2. 3.
Значение - это то, что клиент на экране выводит? Или проекция varchar2(4)? Или строковый литерал? "Представление в байтах" - это к чему? Собственно, наглядно видно, что в нем нет типа. A convert() принимает и возвращает вообще строго один конкретный тип. dump же покажет, что независимо от того какой у тебя nls_lang покажет одно и то же - датабазную унутрянку: с al32utf8 базы, хоть с 1251 хоть c utf8 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
andrey_anonymous Или, быть может, так будет понятнее: Код: plsql 1. 2. 3. 4. 5.
пока не стало понятнее: ты показываешь 3 разных числовых типа и говоришь, что у них одно значение, но разное "внутреннее представление"? То есть значение - это число 123? какого тогда оно типа из показанных 3х? Может все-таки это разные "значения"? А если разные, то к чему пример? Чтобы показать что? Ну и в дампе видно, что тип не хранится во "внутреннем представлении". Тип берется из метаданных (переменной/столбца/литерала...). Например, ту же требуху можем засунуть в разные типы: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
andrey_anonymous Минимальный пример: Код: plsql 1.
ну и возвращаясь к контексту: andrey_anonymous Sayan Malakshinovто, что при `create view as select null x from dual` x определен как varchar2(0) не значит, что NULL имеет тип извращенный sys.standard.add_months Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.01.2022, 05:02 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan Malakshinov не понимаю Не судьба, сталбыть. Остается надеяться, что тот, кому надо - таки поймет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 14:13 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan, "значения" - это набор битов вместе со способом их интерпретации. Способ интерпретации набора битов определяет тип значения. Один и тот же набор битов может может интерпретироваться как не связанные между собой значения, а andrey_anonymous показывает, как одно и то же "значение" представляется в разных типах разными наборами битов. У этой медали две стороны - на одной из них - (в общем случае, за вычетом понятия subtype) нет способа разумно сравнивать значения, принадлежащие разным типам, без использования процедуры приведения битового представления сравниваемых значений к общему типу. Касательно Null - это специальная штука, говорящая, что вот у нас есть такое-то место для размещения значения, но в нём еще никакого значения не размещено. Поскольку место предназначено для размещения значений определенного типа, то и к Null, сидящему в этом месте, всегда можно относиться как к типизированному, даже если его двоичное представление универсально. "минимальный пример" строит однострочное отношение, кортеж в котором состоит из одного элемента, и этот элемент не может не иметь типа, даже если не содержит значения. А "где написано", каким должен оказаться тип элемента в таком случае, я не знаю. Умеренно естественно ждать его как Varchar2 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 16:39 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
booby, Весьма спорно, тк часто говорится что null - это отсутствие значения. Те null value == no value. И тогда вы едите его не с той стороны. Если же вы утверждаете, что значение - это то, что имеет тип, то это вообще получается софистика и в общем случае к null, включая кучи примеров из этого топика (и даже "минимальный пример" - попробуйте создать таблицу из него) не применимы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 17:52 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
А, главное, возвращаясь к предмету спора, этот "минимальный пример" не может служить доказательством того, что null имеет тип. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 17:58 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan Malakshinov, я пробежал по тексту сейчас и не смог себе вполне уяснить, в чем же существо спора. Без дополнительных пояснений, что необходимо доказать утверждением, или его опровержением, не ясно, о чём вообще идет речь. Прочитанное я могу интерпретировать так: существом спора является вопрос - является ли Null значением, или флагом статуса переменной, предназначенной для хранения значения и имеющим два состояния - "значение переменной сформировано"/"значение переменной не сформировано". Я склоняюсь ко второй интерпретации. Но затрудняюсь при этом придать точный смысл высказыванию "Null не имеет типа", если только под Null не понимать собственно литерал, используемый как местозаместитель значения для переменной, способной его не содержать. Мне очевидно, что такой литерал, сам по себе, типа не имеет, и тип значения, которое может располагаться в месте использования такого литерала, выводится из общего контекста выражения. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 19:53 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan Malakshinov А, главное, возвращаясь к предмету спора, этот "минимальный пример" не может служить доказательством того, что null имеет тип. Ну нет у NULL типа. Есть заповедь спущенная Oracle на одной из скрижалей "там где требуется определить тип выражения, а выражение NULL типом выражения считать VARCHAR2". Правда в CASE сам Oracle заповедь и нарушил. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 21:58 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Кстати, "там где требуется определить тип выражения, а выражение NULL типом выражения считать VARCHAR2" тоже не оригинальная заповедь. В ооочень древних версиях это был CHAR - VARCHAR2 еще не существовало. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 22:08 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY Sayan Malakshinov А, главное, возвращаясь к предмету спора, этот "минимальный пример" не может служить доказательством того, что null имеет тип. Ну нет у NULL типа. Есть заповедь спущенная Oracle на одной из скрижалей "там где требуется определить тип выражения, а выражение NULL типом выражения считать VARCHAR2". Правда в CASE сам Oracle заповедь и нарушил. SY. Думаю, в этом определении есть дефект. я бы формулировал так: если выражение эволюционирует в Null, и тип выражения не определяется из контекста, тогда трам-парам-папам. В этом смысле, в case ничего не нарушено, как и в union или "минимальном примере". Тo, что для decode поведение, связанное с выводом типа результата, отличается от case, может быть и удивительно само по себе, но вряд ли говорит о том, что decode несомненно правильно устроен, a case нет. Использованы два разных правила, но каждое из них имеет вполне разумный смысл, хотя и не сходятся друг с другом. Имхо, это обстоятельство недостаточно документировано, это может и плохо. А поведение case expression, имхо, выглядит более разумным по отношению к "жадному" decode, старающемуся определить тип по первому "возвращаемому значению". И особенно, если не считать Null преждевременно значением. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 22:59 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
booby, для decode, кстати, все правила как раз хорошо документированы, и, сами по себе, не имеют отношения к "существу спора": Oracle automatically converts expr and each search value to the data type of the first search value before comparing. Oracle automatically converts the return value to the same data type as the first result. If the first result has the data type CHAR or if the first result is null, then Oracle converts the return value to the data type VARCHAR2. https://docs.oracle.com/database/121/SQLRF/functions057.htm#SQLRF00631 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 23:31 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
booby Думаю, в этом определении есть дефект. я бы формулировал так: если выражение эволюционирует в Null, и тип выражения не определяется из контекста, тогда трам-парам-папам. Непонятно что имеется ввиду под "эволюционирует"? По моему все просто - есть ряд ситуаций где имеется набор выражений связанных неким условием относительно их типов. Что делать когда какие-то выражения NULL (не путать со значениями выражений)? Как проверить условие если у выражения NULL (опять, не путать со значением выражения) типа нет? Oracle решил что в таких случаях мы мы используем VARCHAR2 в качестве типа. И это не значит что тип выражения NULL есть VARCHAR2 или что у выражения NULL вообще есть тип. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2022, 23:42 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY Ну нет у NULL типа. SY Есть заповедь спущенная Oracle на одной из скрижалей "там где требуется определить тип выражения, а выражение NULL типом выражения считать VARCHAR2" andrey_anonymous в качестве default выбран относительно универсальный тип varchar2. Это надо просто помнить К уже перечисленным CASE, UNION и overloaded functions, я еще вспомнил NVL и COALESCE: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/NVL.html The arguments expr1 and expr2 can have any data type. If their data types are different, then Oracle Database implicitly converts one to the other. If they cannot be converted implicitly, then the database returns an error. The implicit conversion is implemented as follows:
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Такая же ситуация и с coalesce только он идет от numeric: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/COALESCE.html If all occurrences of expr are numeric data type or any nonnumeric data type that can be implicitly converted to a numeric data type, then Oracle Database determines the argument with the highest numeric precedence, implicitly converts the remaining arguments to that data type, and returns that data type. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2022, 03:03 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan Malakshinov Именно! И на этом надо остановиться, т.к. такие ответы порождают мифы и приводят к таким вопросам как у ТС. На этом остановиться не получится ибо у ТС возникнет другой вопрос: что делать когда имеется набор выражений связанных неким условием относительно их типов а выражение NULL? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2022, 14:22 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
SY, Избегать неоднозначностей - достаточно универсальный и корректный ответ. Иначе в мифотворчестве придётся вам все время уточнять в каких именно случаях ваш миф/заповедь работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2022, 15:24 |
|
Нарушение UNIQUE-индекса при decode() и соблюдение при CASE в описании индекса
|
|||
---|---|---|---|
#18+
Sayan Malakshinov Иначе в мифотворчестве придётся вам все время уточнять в каких именно случаях ваш миф/заповедь работает. Вот и я о том-же. Mифотворчество порождается отсутствием заповедей . Вот есть-же в DECODE: "If the first result has the data type CHAR or if the first result is null, then Oracle converts the return value to the data type VARCHAR2". А вот для CASE/set operations и других случаев дока молчит что и порождает мифы. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2022, 16:01 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1879617]: |
0ms |
get settings: |
17ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
37ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
673ms |
get tp. blocked users: |
0ms |
others: | 372ms |
total: | 1110ms |
0 / 0 |