|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Добрый день. Провели миграцию с Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi на Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production . Часть пакетов на схеме стало инвалидными. Ошибка такая: Код: plsql 1.
Стал разбираться, нашел, что проблема в nullable константе типа CHAR(1). Привожу пример кода для воспроизведения: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
На 10g выполняется, на 12с ломается. Причем, если поменять тип c_NULL с CHAR(1) на VARCHAR2(1) , то все будет работать на обеих версиях. Если убрать CONSTANT из определения c_NULL, то тоже все будет работать на обеих версиях. Вопрос: почему так? Это баг 12с или какое-то дополнительное новое ограничение? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 08:39 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Artem_7 Вопрос: почему так? Но у тебе даже есть выбор - переходи на 18, там небезопасный секс так строго не наказывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 08:53 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Elic, это синтетический код для воспроизведения ошибки. В реальном коде константа имеет тип TABLE.COLUMN%TYPE. В таблице колонка с типом CHAR(1), используется для хранения значений Y/N. И да, все колонки для хранения булевых значений в схеме имеют тип CHAR(1). Как пофиксить ошибку - тоже понятно. Самое простое добавить в пакет SUBTYPE t_YES_NO IS VARCHAR2(1) и перейти на него. Но если ошибка вызвана багом, то лучше ее лечить патчем Oracle, а не повсеместной правкой кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 09:06 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Artem_7 Но если ошибка вызвана багом, то лучше ее лечить патчем Oracle, а не повсеместной правкой кода. Можно каждый раз одевать высокие ботфорты, чтобы ходить по дерьму, срезая путь через ферму. А можно ходить по проторенным дорогам вокруг ферм и даже в тапочках. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 09:24 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Artem_7 В реальном коде константа имеет тип TABLE.COLUMN%TYPE. , а не повсеместной правкой кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 09:27 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Может, кому пригодится. Нашли Bug 24924667 Bug 24924667 : PLS-00801 LAYOUT MISMATCH ERROR WHILE COMPILING PLSQL WITH CONSTANT VARIABLECompiling PLSQL code which has constant variable with NULL assigned to it fails with below error. That too when this constant is passed to oracle standard packages. PLS-801: internal error [*** ASSERT at file pdy3.c, line 1922; Layout Mismatch - 2 < 13; TEST_CONST_CHAR__SCOTT__B__20460[16,4]] Workaround : 1) Instead of assigning NULL, assign '' to constant variable. 2) Prefix "test_var" with some other values (ie) ''||test_var. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 10:16 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Bug 24924667 : PLS-00801 LAYOUT MISMATCH ERROR WHILE COMPILING PLSQL WITH CONSTANT VARIABLE Workaround : 1) Instead of assigning NULL, assign '' to constant variable. 2) Prefix "test_var" with some other values (ie) ''||test_var. С точки зрения потребителя, я скажу, что вы создаёте добавленную стоимость оракла, не создавая собственной добавленной стоимости. Кому от этого хорошо? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 10:32 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
В топике описан баг обратной совместимости. Oracle баг признал и пофиксил. На всякий случай предупреждаю тех, кто наступит на данную ошибку. Workaround-ы, описанные в Bug 24924667, чинят компиляцию кода, но могут сломать бизнес-логику. Пользоваться ими не рекомендую. Причина проста: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Поэтому, либо ставим фикс от Oracle, либо меняем тип константы/переменной ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 11:18 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Artem_7 Может, кому пригодится. Нашли Bug 24924667 Bug 24924667 : PLS-00801 LAYOUT MISMATCH ERROR WHILE COMPILING PLSQL WITH CONSTANT VARIABLECompiling PLSQL code which has constant variable with NULL assigned to it fails with below error. That too when this constant is passed to oracle standard packages. PLS-801: internal error [*** ASSERT at file pdy3.c, line 1922; Layout Mismatch - 2 < 13; TEST_CONST_CHAR__SCOTT__B__20460[16,4]] Workaround : 1) Instead of assigning NULL, assign '' to constant variable. 2) Prefix "test_var" with some other values (ie) ''||test_var. совет конешно интересный Instead of assigning NULL, assign '' to constant variable. логика ж поменяется, тем более для константы Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
.... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 11:26 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Artem_7 Может, кому пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 11:29 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Ставим фикс Там есть еще подобный баг с >8 параметрами в GREATEST (и других функциях) в PL/SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 11:45 |
|
Проблема с константой типа CHAR в Oracle 12с
|
|||
---|---|---|---|
#18+
Artem_7, Лучше когда не работает чем когда работает, но неправильно. Код: 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.
В первом случае PLS-00801 не возникло благодаря тому, что plsql_optimize_level = 3 форсирует inlining, ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2020, 22:18 |
|
|
start [/forum/topic.php?fid=52&fpage=49&tid=1881373]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 290ms |
total: | 412ms |
0 / 0 |