Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 3 4 [все] |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Доброго дня, уважаемые форумчане. Суть проблемы: есть package, с кол-вом строк ~ 100 000 (автоматическая генерация, будь она не ладна). В пакете есть функция вида: function fIr$Tmp return number is nRes number; begin nRes := 268435456; -- nRes := power(2, 28); -- а так все нормально. return nRes; end; Если функцию поместить в начало пакета, то все корректно работает, а если в конец пакета, то возвращает некорректное значение. Если же в теле функции вместо числа 268435456 указать функцию power(2, 28) (т.е уйти от явного присваивания переменной числа), то все работает независимо от положения функции внутри пакета. Глобальной переменной с именем nRes нет. Результат работы функции: select svc$23532pkg.fIr$Tmp from dual -------------------------------------- 429514 Если внутри функции изменить присваиваемое значение , допустим 268435457, то результат функции не измениться: 429514 Версия БД: select * from v$version ------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production CORE 11.2.0.4.0 Production TNS for Solaris: Version 11.2.0.4.0 - Production NLSRTL Version 11.2.0.4.0 - Production Параметры БД во вложении dbprm.txt Подскажите, куда копать? shared pool? OS? Буду признателен за любой наводящий ответ. К сообщению приложен файл (dbprm.txt - 11Kb) cкачать ![]() |
7 дек 17, 15:54 [21015555] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7437 |
Ivan Rabashchenko,function fIr$Tmp return number is nRes number; begin fIr$Tmp.nRes := 268435456; -- nRes := power(2, 28); -- а так все нормально. return fIr$Tmp.nRes; end; Аналогично? Играться с plsql_optimize_level в сторону уменьшения пробовали? |
7 дек 17, 16:19 [21015678] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
return fIr$Tmp.nRes;
Да, аналогично: некорректное поведение. alter session set plsql_optimize_level = 0; alter package svc$23532pkg compile; select svc$23532pkg.fIr$Tmp from dual -------------------------------------- 429514 |
7 дек 17, 16:58 [21015848] Ответить | Цитировать Сообщить модератору |
AmKad Member Откуда: Сообщений: 5238 |
В dba_source что падает? |
7 дек 17, 17:21 [21015953] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2958 |
Ivan Rabashchenko, на правах версии переполняется "таблица констант" если в конец пакета добавить еще одну ф-цию fIr$Tmp2 с константой (напр 268435457), они будут правильно работать? ps перемещая по телу пакета ф-цию, возможно можно определить когда перестает работать ..... stax |
7 дек 17, 17:22 [21015954] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2958 |
в source наверное все ок, а вот что в p-code вопрос ..... stax |
||
7 дек 17, 17:24 [21015964] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
В словаре все зачетно. select text from dba_source where owner = 'XXXXXX' and name = 'SVC$23532PKG' and line >= 97818 order by line ------------ function fIr$Tmp return number is nRes number; begin nRes := 268435457;--power(2, 28); return nRes; end; END SVC$23532PKG; |
||
7 дек 17, 17:35 [21016008] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Добавил две функции после штатной: function fIr$Tmp return number is nRes number; begin nRes := 268435457;--power(2, 28); return nRes; end; function fIr$Tmp2 return number is cRes CONSTANT number := 268435457; nRes number; begin nRes := cRes; return nRes; end; function fIr$Tmp3 return number is cRes CONSTANT number := 268435457; nRes number; begin return cRes; end; select BP$5024_PO_tmp.fIR$Tmp as ver_0, BP$5024_PO_tmp.fIR$Tmp2 as ver_2, BP$5024_PO_tmp.fIR$Tmp3 as ver_3 from dual VER_0 VER_2 VER_3 ----------------------------- 420057 429514 383429 все разное ) |
||
7 дек 17, 17:56 [21016092] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Пусть Вас не смущает название пакета BP$5024_PO_tmp, это и есть изначально указанный svc$23532pkg |
7 дек 17, 17:59 [21016096] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Простите за мою неграмотность, 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 Вы имели ввиду иное? Просветите, пжл, что это и как его позырить в БД. |
||||
7 дек 17, 18:16 [21016130] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
Ivan Rabashchenko, а если сделать 268435457+0? |
7 дек 17, 18:16 [21016132] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
хотя имхо надо сразу в корень проблемы смотреть раз уж у вас
|
||
7 дек 17, 18:22 [21016151] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Я с Вами полностью согласен, но генератор - священная корова. Да и цель иная: понять природу ошибки. |
||||
7 дек 17, 18:26 [21016161] Ответить | Цитировать Сообщить модератору |
dbms_photoshop Member Откуда: sqlmdx.net Сообщений: 5151 |
Ivan Rabashchenko, А если alter session set plsql_code_type = native;и потом откомпилить? |
7 дек 17, 18:27 [21016165] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Изменил штатную : function fIr$Tmp return number is nRes number; begin nRes := 268435457+0;--power(2, 28); return nRes; end; Переместил в середину пакета на строку 50 000 третий вариант: function fIr$Tmp3 return number is cRes CONSTANT number := 268435457; nRes number; begin return cRes; end; Результат select SVC$23532PKG.fIR$Tmp as ver_0, SVC$23532PKG.fIR$Tmp3 as ver_3 from dual ---------------- VER_0 VER_3 429514 268435457 Т.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу. |
||
7 дек 17, 18:30 [21016175] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
я про точку, ниже которой перестает работать функция |
7 дек 17, 18:31 [21016177] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2958 |
да диана я не коверялся там анврапщики хорошо разбираются наскоко я понимаю код хранится в sys.IDL%$ ..... stax |
||||
7 дек 17, 18:35 [21016190] Ответить | Цитировать Сообщить модератору |
Расплющенная принцесса
Guest |
|
||
7 дек 17, 18:35 [21016191] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
на MOSC сразу на это наткнулся. Мало чем помогло: alter session set plsql_code_type = native; alter package SVC$23532PKG compile; select SVC$23532PKG.fIR$Tmp as ver_0 from dual --------------------------- VER_0 429514 |
||
7 дек 17, 18:37 [21016196] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
Ivan Rabashchenko, а перекомпиляция с включенным/выключенным дебагом тоже не помогает? |
7 дек 17, 18:42 [21016209] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2958 |
возможно и другие ф-ции c константами после точки "невозврата" работают с "глюками" ета простая и Вы сразу определили фичу ps как метод борьбы попробовать в начале пакета добавить функцию "заглушку" с константами ..... stax |
||
7 дек 17, 18:43 [21016211] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Лимиты посмотрел. Вроде в границах допустимого. Указанную фразу взял отседа: Size Limitations on PLSQL Packages (Doc ID 62603.1):
На pls-123 не нарываюсь. |
||||||
7 дек 17, 18:51 [21016247] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
В продолжении об лимитах:select * from USER_OBJECT_SIZE where name = 'SVC$23532PKG' ------------------------------------------------------------------------- SVC$23532PKG PACKAGE 55787 160551 91580 0 SVC$23532PKG PACKAGE BODY 5516957 6848 6959681 0 И по строкам в пакете (из той же доки):
Я понимаю, что строки бывают разные, но в пакете строки-коротыши и малым кол-вом токенов ( (identifiers, operators, functions и т.д.) |
||
7 дек 17, 19:06 [21016306] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
alter session set plsql_debug = true; alter package SVC$23532PKG compile debug; select SVC$23532PKG.fIR$Tmp as ver_0 from dual VER_0 ------ 429514 Не помогло. Размер: select * from USER_OBJECT_SIZE where name = 'SVC$23532PKG' NAME TYPE SOURCE_SIZE PARSED_SIZE CODE_SIZE ERROR_SIZE ------------------------------------------------------------------------ SVC$23532PKG PACKAGE 55787 160551 91580 0 SVC$23532PKG PACKAGE BODY 5516957 6848 6959449 0 |
||
7 дек 17, 19:20 [21016338] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Все верно, ниже определенной точки в пакете функции перестают корректно работать. Мой пример - упрощенная модель. Вы писали: "как метод борьбы попробовать в начале пакета добавить функцию "заглушку" с константами" Сори, не понял. Не могли бы Вы раскрыть тему? Просто в начале пакета сделать фейковую функцию вида: function fXXX return number is c1 CONSTANT number := 268435457; c2 CONSTANT number := 268435457; ... cn CONSTANT number := 268435457; begin return cn; end; ? |
||||
7 дек 17, 19:25 [21016352] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9431 |
IMHO жесть какая Не проще пакет на несколько пакетов разделить? Ну и самый интересный вопрос: а что говорит Oracle Support на эту багу? |
||
7 дек 17, 19:38 [21016381] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет |
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 Сообщений: 5151 |
|
|||||
7 дек 17, 21:35 [21016617] Ответить | Цитировать Сообщить модератору |
dbms_photoshop Member Откуда: sqlmdx.net Сообщений: 5151 |
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 Откуда: Запорожье Сообщений: 54834 |
Ivan Rabashchenko, еще можно попробовать дропнуть полностью пакет и заново создать |
7 дек 17, 22:44 [21016785] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9431 |
Как программист - не понимаю. Если с размером 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 Откуда: Запорожье Сообщений: 54834 |
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 Откуда: Сообщений: 15330 |
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит. |
8 дек 17, 10:31 [21017332] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
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 Откуда: Сообщений: 15330 |
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] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
-2-, Имхо не хэш а переполнение индекса |
8 дек 17, 11:36 [21017576] Ответить | Цитировать Сообщить модератору |
PL/SQL Program Limits
Guest |
Читаем доки PL/SQL Program Limits |
8 дек 17, 11:48 [21017618] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
Имхо как-то так должно быть:
|
||||||
8 дек 17, 12:24 [21017730] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
допустим ошибка из-за переполнения таблицы констант. Тогда как объяснить это: Я создал в пакете две функции: select line, name, text from all_source where owner = 'COLVIR' and name = 'SVC$23532PKG' and type = 'PACKAGE BODY' and line > 97825 order by line LINE NAME TEXT ------------------------------------------------------------ 97826 SVC$23532PKG "function fIr$Tmp2 return number is 97827 SVC$23532PKG "nRes number; 97828 SVC$23532PKG " begin 97829 SVC$23532PKG " nRes := 268435457; 97830 SVC$23532PKG " return nRes; 97831 SVC$23532PKG " end; 97832 SVC$23532PKG "function fIr$Tmp return number is 97833 SVC$23532PKG "nRes number; 97834 SVC$23532PKG " begin 97835 SVC$23532PKG " nRes := 26843; 97836 SVC$23532PKG " return nRes; 97837 SVC$23532PKG " end; 97838 SVC$23532PKG "END SVC$23532PKG; та что выше ( fIr$Tmp2) пытается вернуть 268435457, а та что ниже (fIr$Tmp) - 26843 Результат: select SVC$23532PKG.fIr$Tmp fIr$Tmp,SVC$23532PKG.fIr$Tmp2 fIr$Tmp2 from dual ---------------------------------------------------------------- fIr$Tmp fIr$Tmp2 26843 429514 Другими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете. |
8 дек 17, 12:42 [21017845] Ответить | Цитировать Сообщить модератору |
MaximaXXL Member Откуда: Киев Сообщений: 652 |
Ivan Rabashchenko, Может у Вас есть в пакете функция nRes которая возвращает number? И при return nRes; результат отдается не переменной а функции? |
8 дек 17, 12:46 [21017868] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
select * from all_procedures where owner = 'COLVIR' and object_name = 'SVC$23532PKG' and UPPER(procedure_name) like '%NRES%' ------ 0 records found |
||
8 дек 17, 12:49 [21017886] Ответить | Цитировать Сообщить модератору |
MaximaXXL Member Откуда: Киев Сообщений: 652 |
Ivan Rabashchenko, А если так? function fIr$Tmp return number is begin return 268435457; end; |
8 дек 17, 12:54 [21017910] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
![]() с небольшой правкой от меня:21017730 |
||
8 дек 17, 12:54 [21017911] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
если объяснить его пример простыми словами, то:
Сообщение было отредактировано: 8 дек 17, 13:50 |
|||
8 дек 17, 13:02 [21017939] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Спасибо огромное за разъяснения. |
8 дек 17, 13:33 [21018046] Ответить | Цитировать Сообщить модератору |
PL/SQL Program Limits
Guest |
Под вот это не попадает?
Ну или на крайний случай их просто забыли упомянуть
|
|||||||||||
8 дек 17, 13:50 [21018133] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Если я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет? |
8 дек 17, 14:22 [21018279] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 9431 |
PL/SQL Program Limits, Ошибка то где? Хотя бы даже ORA-600.... Бага она и есть бага. Т.ч. документация идет лесом. IMHO |
8 дек 17, 14:38 [21018377] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54834 |
помню, был в 1996 некий анализ еще клипперного ПО там тоже упирались в количество переменных Предлагали делать массивом, один массив на все тыщи переменных Т.е. в нашем случае - сделать коллекцию констант Правда, для заполнения коллекции придется ее теми же константами и заполнять... которые надо где-то хранить |
8 дек 17, 14:47 [21018454] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
|
||
8 дек 17, 15:00 [21018505] Ответить | Цитировать Сообщить модератору |
dba123 Member Откуда: Сообщений: 1054 |
xtender, таблица констант - только для чисел? n varchar2(20); - как в этом случае повторить пример спасибо |
8 дек 17, 15:21 [21018577] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
Если уж сильно интересно поковыряться, то тут:
если не ошибаюсь #xxx и есть индекс константы |
|||
8 дек 17, 15:31 [21018632] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Нужно, чтобы понять, насколько критично кол-во констант в пакете. Спасибо за помощь. |
|||||
8 дек 17, 15:39 [21018660] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
|
||
8 дек 17, 15:40 [21018665] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 7437 |
Ivan Rabashchenko, Так генератор поправить можно? function fIr$Tmp return number is nRes number; begin select 268435456 into nRes from dual; return nRes; end; |
8 дек 17, 15:50 [21018721] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
Ivan Rabashchenko, тогда уж так проще было бы: select sum(regexp_count(text,'(\W|^)\d+(\.\d+)?(\W|$)',1)) nums_count from user_source s where name='&package' and type='PACKAGE BODY' |
8 дек 17, 15:51 [21018724] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
env, уж проще было бы просто to_number '268435456' без запроса |
8 дек 17, 15:53 [21018736] Ответить | Цитировать Сообщить модератору |
AmKad Member Откуда: Сообщений: 5238 |
return '268435457'; |
||
8 дек 17, 15:56 [21018748] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
AmKad, да нормально должно... можешь попробовать на основе этого теста: 21017939 |
8 дек 17, 15:59 [21018768] Ответить | Цитировать Сообщить модератору |
AmKad Member Откуда: Сообщений: 5238 |
xtender, В лом). Пусть автор пробует, в качестве workaround это для него самый быстрый вариант. |
8 дек 17, 16:00 [21018776] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
Спасибо за workaround! return 'xxxxxxxxxx' норм вариант |
||
8 дек 17, 16:14 [21018831] Ответить | Цитировать Сообщить модератору |
AmKad Member Откуда: Сообщений: 5238 |
![]() |
||
8 дек 17, 16:19 [21018852] Ответить | Цитировать Сообщить модератору |
Ivan Rabashchenko Member Откуда: Minsk Сообщений: 35 |
), -2- , xtender и всем всем огромное спасибо еще раз. |
8 дек 17, 16:27 [21018875] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
все проще: надо просто добавить .0 к константам, т.е. тупо n:=268435457.0; |
8 дек 17, 17:26 [21019020] Ответить | Цитировать Сообщить модератору |
Sayan Malakshinov Member Откуда: Мск Сообщений: 5783 |
можно даже сократить до точки
|
||
8 дек 17, 17:29 [21019029] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 3 4 [все] |
Все форумы / Oracle | ![]() |