Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 4 вперед Ctrl→ все |
Leonid Kudryavtsev Member Откуда: Сообщений: 7393 |
IMHO жесть какая Не проще пакет на несколько пакетов разделить? Ну и самый интересный вопрос: а что говорит Oracle Support на эту багу? |
||
7 дек 17, 19:38 [21016381] Ответить | Цитировать Сообщить модератору |
xtender Member Откуда: Мск Сообщений: 5029 |
А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет |
7 дек 17, 20:41 [21016535] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Леонид, нет не проще. Для этого нужно изменить не только код генератора пакетов, но и всю парадигму системы, а это тьма кода, который работает поверх этих нелепых, неповоротливых, гигантских пакетов. К этому добавлю, что нарвались мы на этот bug только лишь у одного клиента (а их сонм), у которого и OS и БД знакомые (связка такая много у кого Solaris + 11.2.0.4) и затевать глобальный рефакторинг это очень смелый и дорогой шаг. Возможно, обойдемся малой кровью. Сначала решил сам поколупаться - не получилось (не хватает знания матчасти) , затем решил спросить умных людей (спасибо всем кто откликается), если решения не найдем, зарегим официальную ноту на Oracle Support. |
7 дек 17, 20:48 [21016549] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Вполне возможно, на сегодня забрали доступ, завтра с утра предоставлю такую информацию. |
||
7 дек 17, 20:54 [21016559] Ответить | Цитировать Сообщить модератору |
MaximaXXL Member Откуда: Киев Сообщений: 652 |
Ivan Rabashchenko, А можете попробовать с числом 268435455 и написать полученный результат? |
7 дек 17, 20:54 [21016561] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Мне наверное стоило в моем первом комментарии уточнить вот такой факт: Если оперировать не большими числами, например: function fIr$Tmp return number is nRes number; begin nRes := 268; return nRes; end; то все работает корректно независимо от положения в пакете. А если 268435456, например, то натыкаемся на некорректное поведение. Чтобы было понятнее, структура пакета такая: ...... function fIr$Tmp_110 return number is nRes number; begin nRes := 268435456; return nRes; end; function fIr$Tmp_111 return number is nRes number; begin nRes := 268; return nRes; end; function fIr$Tmp_112 return number is nRes number; begin nRes := 268435457; return nRes; end; ...... и получается, что fIr$Tmp_110 и fIr$Tmp_112 возвращают ересь, а fIr$Tmp_111 - норм. |
||
7 дек 17, 21:16 [21016591] Ответить | Цитировать Сообщить модератору |
dbms_photoshop Member Откуда: sqlmdx.net Сообщений: 5149 |
|
|||||
7 дек 17, 21:35 [21016617] Ответить | Цитировать Сообщить модератору |
dbms_photoshop Member Откуда: sqlmdx.net Сообщений: 5149 |
Ivan Rabashchenko, А если включить alter session set plsql_warnings = 'enable:all';? |
7 дек 17, 21:35 [21016619] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
К сожалению, только завтра смогу все проверить. |
7 дек 17, 21:48 [21016641] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 49816 |
Ivan Rabashchenko, еще можно попробовать дропнуть полностью пакет и заново создать |
7 дек 17, 22:44 [21016785] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 7393 |
Как программист - не понимаю. Если с размером specification проблем нет, а только с размером body, то никто не мешает точку входа в API оставить в одном пакете. Сделать пакет-прокси со старым именем, который просто будет вызывать функции из других пакетов. Код приложения, кроме генератора, менять не нужно Единственная проблема чисто технического разделения - возможные связи между private (не вынесенные в спецификацию) функциями и глобальные переменные в пакете. Лично я бы, первым делом, все глобальные переменные из пакета вынес в отдельный пакет (что бы на них всегда можно было ссылаться из всех генерированных пакетов), дальше бы разбирался, какие блоки функций можно отделить друг от друга. Сомневаюсь, что все 100 000 строк сгенерированного кода настолько сильно связаны друг с другом, что их не разделить. Второе возможное решение, запрос в Oracle и фиксенье бага. Поиск мелодии для бубна, который заставит обратно заработать систему у одного неудачливого заказчика.... это конечно хорошо, но как-то вызывает опасение. Если один раз свалилось на 100 000 строк кода, то кто может гарантировать, что в следующий раз не свалится на пакете в 101 000 строк кода и прошлогодняя мелодия и бубен поможет и в следующий раз? IMHO & AFAIK |
||
7 дек 17, 23:06 [21016822] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
select count(*) from all_source where owner = 'XXXXXXX' and type = 'PACKAGE BODY' and name = 'SVC$23532PKG' and text like '%(429514,%' -- 130 -- 429514 - некорректное значение, возвращаемое fIr$Tmp select count(*) from all_source where owner = 'XXXXXXX' and type = 'PACKAGE BODY' and name = 'SVC$23532PKG' and text like '%26843545%' -- 3 -- это одна штатная fIr$Tmp + две, которые ввел по ходу обсуждения: fIr$Tmp2 + fIr$Tmp3 Есть такое. Чем мне (нам) этот факт может помочь?
function fIr$Tmp return number is nRes number; begin nRes := 268435455; return nRes; end; select SVC$23532PKG.fIR$Tmp as ver_0 from dual ------- VER_0 429514 Ожидаемо, некорректный результат. |
||||
8 дек 17, 09:40 [21017216] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
drop package SVC$23532PKG; create or replace package SVC$23532PKG as... create or replace package body SVC$23532PKG as... select SVC$23532PKG.fIR$Tmp as ver_0 from dual ------- VER_0 429514 |
||
8 дек 17, 09:48 [21017236] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 49816 |
Ivan Rabashchenko, а так? :) drop package SVC$23532PKG; --create or replace package SVC$23532PKG as... --create or replace package body SVC$23532PKG as... select SVC$23532PKG.fIR$Tmp as ver_0 from dual ??? |
8 дек 17, 10:07 [21017280] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Намекаете, что drop не отрабатывает? drop package SVC$23532PKG; select SVC$23532PKG.fIr$Tmp from dual ORA-00904: "SVC$23532PKG"."FIR$TMP": invalid identifier |
||
8 дек 17, 10:25 [21017320] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 14345 |
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит. |
8 дек 17, 10:31 [21017332] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 14345 |
set serveroutput on declare c clob; begin c := 'declare n number;begin'||chr(10); for i in 1..32768 loop c := c || ' n := ' || to_char(i+1000000) || ';' || chr(10); end loop; c := c || ' dbms_output.put_line(''n=''||n);' || chr(10); c := c || 'end;' || chr(10); dbms_output.put_line(substr(c, -53)); execute immediate c; end; / -- 32767/+1000000 n := 1032767; dbms_output.put_line('n='||n); end; n=1032767 -- 32768/+1000000 n := 1032768; dbms_output.put_line('n='||n); end; n=0 -- 32768/+0 n := 32768; dbms_output.put_line('n='||n); end; n=32768 |
8 дек 17, 10:43 [21017369] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
alter session set plsql_warnings = 'enable:all'; alter package SVC$23532PKG compile; select text, count(1) from dba_errors where name = 'SVC$23532PKG' group by text ----- PLW-06010: keyword "RESULT" used as a defined name 149 PLW-07203: parameter 'OP' may benefit from use of the NOCOPY compiler hint 1452 PLW-06002: Unreachable code 473 PLW-05018: unit SVC$23532PKG omitted optional AUTHID clause; default value DEFINER used 1 |
||
8 дек 17, 10:49 [21017401] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Указанный вам пример порождает PLS-00123 и у меня на разных платформах (Win\Linus\Solaris + 11.2.0.4\12.1.0.2) |
|||||
8 дек 17, 11:03 [21017438] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 14345 |
declare n number; begin n := 1000001; n := 1000002; ... n := 1032766; n := 1032767; dbms_output.put_line('32770='||32770); dbms_output.put_line('32769='||32769); dbms_output.put_line('32768='||32768); dbms_output.put_line('32767='||32767); dbms_output.put_line('1000001='||1000001); dbms_output.put_line('1032767='||1032767); end; / 32770=0 32769=1000001 32768=1000002 32767=32767 1000001=1000003 1032767=1000004 |
8 дек 17, 11:06 [21017447] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
О, это уже горячо. Уважаемый, -2-, подскажите пжл документ, в котором указано такое ограничение. |
||
8 дек 17, 11:15 [21017475] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Мне сразу дали намек, а его не понял... |
||
8 дек 17, 11:21 [21017498] Ответить | Цитировать Сообщить модератору |
xtender Member Откуда: Мск Сообщений: 5029 |
-2-, Имхо не хэш а переполнение индекса |
8 дек 17, 11:36 [21017576] Ответить | Цитировать Сообщить модератору |
PL/SQL Program Limits
Guest |
Читаем доки PL/SQL Program Limits |
8 дек 17, 11:48 [21017618] Ответить | Цитировать Сообщить модератору |
xtender Member Откуда: Мск Сообщений: 5029 |
Имхо как-то так должно быть:
|
||||||
8 дек 17, 12:24 [21017730] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 [2] 3 4 вперед Ctrl→ все |
Все форумы / Oracle | ![]() |