|
|
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Доброго дня, уважаемые форумчане. Суть проблемы: есть package, с кол-вом строк ~ 100 000 (автоматическая генерация, будь она не ладна). В пакете есть функция вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. Если функцию поместить в начало пакета, то все корректно работает, а если в конец пакета, то возвращает некорректное значение. Если же в теле функции вместо числа 268435456 указать функцию power(2, 28) (т.е уйти от явного присваивания переменной числа), то все работает независимо от положения функции внутри пакета. Глобальной переменной с именем nRes нет. Результат работы функции: Код: plsql 1. 2. 3. Если внутри функции изменить присваиваемое значение , допустим 268435457, то результат функции не измениться: 429514 Версия БД: Код: plsql 1. 2. 3. 4. 5. 6. 7. Параметры БД во вложении dbprm.txt Подскажите, куда копать? shared pool? OS? Буду признателен за любой наводящий ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 15:54 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, Код: plsql 1. 2. 3. 4. 5. 6. 7. Аналогично? Играться с plsql_optimize_level в сторону уменьшения пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 16:19 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. Да, аналогично: некорректное поведение. Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 16:58 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
В dba_source что падает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 17:21 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, на правах версии переполняется "таблица констант" если в конец пакета добавить еще одну ф-цию fIr$Tmp2 с константой (напр 268435457), они будут правильно работать? ps перемещая по телу пакета ф-цию, возможно можно определить когда перестает работать ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 17:22 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
AmKadВ dba_source что падает? в source наверное все ок, а вот что в p-code вопрос ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 17:24 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
AmKadВ dba_source что падает? В словаре все зачетно. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 17:35 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
StaxIvan Rabashchenko, на правах версии переполняется "таблица констант" если в конец пакета добавить еще одну ф-цию fIr$Tmp2 с константой (напр 268435457), они будут правильно работать? ps перемещая по телу пакета ф-цию, возможно можно определить когда перестает работать ..... stax Добавил две функции после штатной: Код: 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. все разное ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 17:56 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Пусть Вас не смущает название пакета BP$5024_PO_tmp, это и есть изначально указанный svc$23532pkg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 17:59 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
StaxAmKadВ dba_source что падает? в source наверное все ок, а вот что в p-code вопрос ..... stax Простите за мою неграмотность, p-code, это Вы про DIANA ? Starting with release 7.3.4, the DIANA for package bodies is thrown away, not used, and not stored in the database Или под p-code Вы имели ввиду иное? Просветите, пжл, что это и как его позырить в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:16 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, а если сделать 268435457+0? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:16 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
хотя имхо надо сразу в корень проблемы смотреть раз уж у вас Ivan Rabashchenkoавтоматическая генерациято почему бы просто несколько разных пакетов/функций не генерировать? гораздо удобнее бы вам стало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:22 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtenderхотя имхо надо сразу в корень проблемы смотреть раз уж у вас Ivan Rabashchenkoавтоматическая генерациято почему бы просто несколько разных пакетов/функций не генерировать? гораздо удобнее бы вам стало Я с Вами полностью согласен, но генератор - священная корова. Да и цель иная: понять природу ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:26 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, А если Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:27 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtenderIvan Rabashchenko, а если сделать 268435457+0? Изменил штатную : Код: plsql 1. 2. 3. 4. 5. 6. Переместил в середину пакета на строку 50 000 третий вариант: Код: plsql 1. 2. 3. 4. 5. 6. Результат Код: plsql 1. 2. 3. 4. Т.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:30 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
я про точку, ниже которой перестает работать функция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:31 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan RabashchenkoStaxпропущено... в source наверное все ок, а вот что в p-code вопрос ..... stax Простите за мою неграмотность, p-code, это Вы про DIANA ? Starting with release 7.3.4, the DIANA for package bodies is thrown away, not used, and not stored in the database Или под p-code Вы имели ввиду иное? Просветите, пжл, что это и как его позырить в БД. да диана я не коверялся там анврапщики хорошо разбираются наскоко я понимаю код хранится в sys.IDL%$ ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:35 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan RabashchenkoStarting with release 7.3.4, the DIANA for package bodies is thrown away, not used, and not stored in the databaseЭто откуда? Смотри в доке plsql лимиты, там есть что посчитать. По объему parsed_code грозятся ошибкой pls-123. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:35 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopIvan Rabashchenko, А если Код: plaintext на MOSC сразу на это наткнулся. Мало чем помогло: Код: plsql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:37 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, а перекомпиляция с включенным/выключенным дебагом тоже не помогает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:42 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan RabashchenkoТ.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу. возможно и другие ф-ции c константами после точки "невозврата" работают с "глюками" ета простая и Вы сразу определили фичу ps как метод борьбы попробовать в начале пакета добавить функцию "заглушку" с константами ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:43 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Расплющенная принцессаIvan RabashchenkoStarting with release 7.3.4, the DIANA for package bodies is thrown away, not used, and not stored in the databaseЭто откуда? Смотри в доке plsql лимиты, там есть что посчитать. По объему parsed_code грозятся ошибкой pls-123. Лимиты посмотрел. Вроде в границах допустимого. Указанную фразу взял отседа: Size Limitations on PLSQL Packages (Doc ID 62603.1): Additional Information: a) DIANA is represented in IDL. The linear version of IDL is stored on disk. The actual parse tree is built up and stored in the shared pool. This is why the size of DIANA in the shared pool is typically larger than on disk. b) DIANA for called procedures is required in the shared pool only when you create procedures. In production systems, there is no need for DIANA in the shared pool (but only for the MCODE). c) Starting with release 7.3.4, the DIANA for package bodies is thrown away, not used, and not stored in the database. This is why the PARSED_SIZE (i.e. size of DIANA) of PACKAGE BODIES is 0. На pls-123 не нарываюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 18:51 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
В продолжении об лимитах: Код: plsql 1. 2. 3. 4. И по строкам в пакете (из той же доки): Starting with 8.1.3, the limit was relaxed for package bodies and type bodies which can now have approximately up to about 6,000,000 lines of code. Я понимаю, что строки бывают разные, но в пакете строки-коротыши и малым кол-вом токенов ( (identifiers, operators, functions и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 19:06 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtenderIvan Rabashchenko, а перекомпиляция с включенным/выключенным дебагом тоже не помогает? Код: plsql 1. 2. 3. 4. 5. 6. 7. Не помогло. Размер: Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 19:20 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
StaxIvan RabashchenkoТ.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу. возможно и другие ф-ции c константами после точки "невозврата" работают с "глюками" ета простая и Вы сразу определили фичу ps как метод борьбы попробовать в начале пакета добавить функцию "заглушку" с константами ..... stax Все верно, ниже определенной точки в пакете функции перестают корректно работать. Мой пример - упрощенная модель. Вы писали: "как метод борьбы попробовать в начале пакета добавить функцию "заглушку" с константами" Сори, не понял. Не могли бы Вы раскрыть тему? Просто в начале пакета сделать фейковую функцию вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 19:25 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko...Просто в начале пакета сделать фейковую функцию вида... IMHO жесть какая Не проще пакет на несколько пакетов разделить? Ну и самый интересный вопрос: а что говорит Oracle Support на эту багу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 19:38 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 20:41 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Леонид, нет не проще. Для этого нужно изменить не только код генератора пакетов, но и всю парадигму системы, а это тьма кода, который работает поверх этих нелепых, неповоротливых, гигантских пакетов. К этому добавлю, что нарвались мы на этот bug только лишь у одного клиента (а их сонм), у которого и OS и БД знакомые (связка такая много у кого Solaris + 11.2.0.4) и затевать глобальный рефакторинг это очень смелый и дорогой шаг. Возможно, обойдемся малой кровью. Сначала решил сам поколупаться - не получилось (не хватает знания матчасти) , затем решил спросить умных людей (спасибо всем кто откликается), если решения не найдем, зарегим официальную ноту на Oracle Support. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 20:48 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtenderА эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет Вполне возможно, на сегодня забрали доступ, завтра с утра предоставлю такую информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 20:54 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, А можете попробовать с числом 268435455 и написать полученный результат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 20:54 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
MaximaXXLIvan Rabashchenko, А можете попробовать с числом 268435455 и написать полученный результат? Мне наверное стоило в моем первом комментарии уточнить вот такой факт: Если оперировать не большими числами, например: Код: plsql 1. 2. 3. 4. 5. 6. то все работает корректно независимо от положения в пакете. А если 268435456, например, то натыкаемся на некорректное поведение. Чтобы было понятнее, структура пакета такая: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. и получается, что fIr$Tmp_110 и fIr$Tmp_112 возвращают ересь, а fIr$Tmp_111 - норм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 21:16 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Расплющенная принцессаIvan RabashchenkoStarting with release 7.3.4, the DIANA for package bodies is thrown away, not used, and not stored in the databaseЭто откуда? Смотри в доке plsql лимиты, там есть что посчитать. По объему parsed_code грозятся ошибкой pls-123. И она даже возникает. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 21:35 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, А если включить Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 21:35 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
К сожалению, только завтра смогу все проверить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 21:48 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, еще можно попробовать дропнуть полностью пакет и заново создать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 22:44 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan RabashchenkoДля этого нужно изменить не только код генератора пакетов, но и всю парадигму системы, а это тьма кода, который работает поверх этих нелепых, неповоротливых, гигантских пакетов. Как программист - не понимаю. Если с размером specification проблем нет, а только с размером body, то никто не мешает точку входа в API оставить в одном пакете. Сделать пакет-прокси со старым именем, который просто будет вызывать функции из других пакетов. Код приложения, кроме генератора, менять не нужно Единственная проблема чисто технического разделения - возможные связи между private (не вынесенные в спецификацию) функциями и глобальные переменные в пакете. Лично я бы, первым делом, все глобальные переменные из пакета вынес в отдельный пакет (что бы на них всегда можно было ссылаться из всех генерированных пакетов), дальше бы разбирался, какие блоки функций можно отделить друг от друга. Сомневаюсь, что все 100 000 строк сгенерированного кода настолько сильно связаны друг с другом, что их не разделить. Второе возможное решение, запрос в Oracle и фиксенье бага. Поиск мелодии для бубна, который заставит обратно заработать систему у одного неудачливого заказчика.... это конечно хорошо, но как-то вызывает опасение. Если один раз свалилось на 100 000 строк кода, то кто может гарантировать, что в следующий раз не свалится на пакете в 101 000 строк кода и прошлогодняя мелодия и бубен поможет и в следующий раз? IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 23:06 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtender А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Есть такое. Чем мне (нам) этот факт может помочь? MaximaXXLIvan Rabashchenko, А можете попробовать с числом 268435455 и написать полученный результат? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Ожидаемо, некорректный результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 09:40 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
andreymxIvan Rabashchenko, еще можно попробовать дропнуть полностью пакет и заново создать Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 09:48 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, а так? :) Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 10:07 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
andreymxIvan Rabashchenko, а так? :) Код: plsql 1. 2. 3. 4. 5. 6. Намекаете, что drop не отрабатывает? Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 10:25 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 10:31 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 10:43 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopIvan Rabashchenko, А если включить Код: plaintext Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 10:49 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopРасплющенная принцессапропущено... Это откуда? Смотри в доке plsql лимиты, там есть что посчитать. По объему parsed_code грозятся ошибкой pls-123. И она даже возникает. Код: 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. Указанный вам пример порождает PLS-00123 и у меня на разных платформах (Win\Linus\Solaris + 11.2.0.4\12.1.0.2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 11:03 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 11:06 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
-2-Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит. О, это уже горячо. Уважаемый, -2-, подскажите пжл документ, в котором указано такое ограничение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 11:15 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
StaxIvan Rabashchenko, на правах версии переполняется "таблица констант" если в конец пакета добавить еще одну ф-цию fIr$Tmp2 с константой (напр 268435457), они будут правильно работать? ps перемещая по телу пакета ф-цию, возможно можно определить когда перестает работать ..... stax Мне сразу дали намек, а его не понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 11:21 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
-2-, Имхо не хэш а переполнение индекса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 11:36 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Читаем доки PL/SQL Program Limits ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 11:48 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
-2-Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит. Имхо как-то так должно быть:-2-Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Для оптимизации, константы Более 16 бит заносятся в некий массив, а вместо константы указывается ее индекс в этой таблице. На выполнении из-за переполнения из массива выбирается по индексу младших 15/16 бит. PL/SQL Program LimitsЧитаем доки PL/SQL Program Limits лимита на количество литералов там нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 12:24 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
допустим ошибка из-за переполнения таблицы констант. Тогда как объяснить это: Я создал в пакете две функции: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. та что выше ( fIr$Tmp2) пытается вернуть 268435457, а та что ниже (fIr$Tmp) - 26843 Результат: Код: plsql 1. 2. 3. 4. Другими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 12:42 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, Может у Вас есть в пакете функция nRes которая возвращает number? И при return nRes; результат отдается не переменной а функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 12:46 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
MaximaXXLIvan Rabashchenko, Может у Вас есть в пакете функция nRes которая возвращает number? И при return nRes; результат отдается не переменной а функции? Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 12:49 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, А если так? Код: plsql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 12:54 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan RabashchenkoДругими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете.так -2- написал же 21017332 и даже показал. с небольшой правкой от меня: 21017730 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 12:54 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
если объяснить его пример простыми словами, то: -2- Код: 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. тестовый код Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 13:02 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Спасибо огромное за разъяснения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 13:33 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtenderPL/SQL Program LimitsЧитаем доки PL/SQL Program Limits лимита на количество литералов там нет Под вот это не попадает? ItemLimitbind variables passed to a program unit32768 Ну или на крайний случай их просто забыли упомянутьавтор...such as identifiers, keywords, operators, and so on. This allows for ~6,000,000 lines of code unless you exceed limits imposed by the PL/SQL compiler, some of which are given in Table C-1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 13:50 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 14:22 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
PL/SQL Program Limits, Ошибка то где? Хотя бы даже ORA-600.... Бага она и есть бага. Т.ч. документация идет лесом. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 14:38 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
помню, был в 1996 некий анализ еще клипперного ПО там тоже упирались в количество переменных Предлагали делать массивом, один массив на все тыщи переменных Т.е. в нашем случае - сделать коллекцию констант Правда, для заполнения коллекции придется ее теми же константами и заполнять... которые надо где-то хранить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 14:47 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
PL/SQL Program LimitsПод вот это не попадает?не попадает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:00 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtender, таблица констант - только для чисел? n varchar2(20); - как в этом случае повторить пример спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:21 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan RabashchenkoЕсли я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?да зачем это вам надо? Если уж сильно интересно поковыряться, то тут: Код: 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. подробности: https://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Finnigan.pdf если не ошибаюсь #xxx и есть индекс константы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:31 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtenderIvan RabashchenkoЕсли я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?да зачем это вам надо? Если уж сильно интересно поковыряться, то тут: Код: 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. подробности: https://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Finnigan.pdf если не ошибаюсь #xxx и есть индекс константы Нужно, чтобы понять, насколько критично кол-во констант в пакете. Спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:39 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
dba123xtender, таблица констант - только для чисел? n varchar2(20); - как в этом случае повторить пример спасибос varchar2 такой оптимизации нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:40 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, Так генератор поправить можно? Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:50 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan Rabashchenko, тогда уж так проще было бы: Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:51 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
env, уж проще было бы просто to_number '268435456' без запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:53 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtenderс varchar2 такой оптимизации нетИнтересно, как отработает с неявным преобразованием и plsql_optimize_level, скажем, равным нулю: Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:56 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 15:59 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
xtender, В лом). Пусть автор пробует, в качестве workaround это для него самый быстрый вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 16:00 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
AmKadxtender, В лом). Пусть автор пробует, в качестве workaround это для него самый быстрый вариант. Спасибо за workaround! return 'xxxxxxxxxx' норм вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 16:14 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
Ivan RabashchenkoСпасибо за workaround! return 'xxxxxxxxxx' норм вариантБлагодари -2-, это он разгадал особенности компиляции PL/SQL кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 16:19 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
), -2- , xtender и всем всем огромное спасибо еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 16:27 |
|
||
|
Странное поведение переменных в пакетах, с большим количеством строк
|
|||
|---|---|---|---|
|
#18+
все проще: надо просто добавить .0 к константам, т.е. тупо Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2017, 17:26 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1884763]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
190ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
93ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 578ms |

| 0 / 0 |
