|
Нарушение 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?fid=52&msg=40125375&tid=1879617]: |
0ms |
get settings: |
4ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
31ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
315ms |
get tp. blocked users: |
1ms |
others: | 291ms |
total: | 655ms |
0 / 0 |