powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк
77 сообщений из 77, показаны все 4 страниц
Странное поведение переменных в пакетах, с большим количеством строк
    #39565998
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня, уважаемые форумчане.
Суть проблемы: есть package, с кол-вом строк ~ 100 000 (автоматическая генерация, будь она не ладна).
В пакете есть функция вида:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
function fIr$Tmp return number is
nRes number;
begin        
  nRes :=  268435456;
  -- nRes := power(2, 28); -- а так все нормально.
  return nRes;
end;



Если функцию поместить в начало пакета, то все корректно работает, а если в конец пакета, то возвращает некорректное значение. Если же в теле функции вместо числа 268435456 указать функцию power(2, 28) (т.е уйти от явного присваивания переменной числа), то все работает независимо от положения функции внутри пакета. Глобальной переменной с именем nRes нет.

Результат работы функции:

Код: plsql
1.
2.
3.
select svc$23532pkg.fIr$Tmp from dual
--------------------------------------
429514



Если внутри функции изменить присваиваемое значение , допустим 268435457, то результат функции не измениться: 429514

Версия БД:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
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?
Буду признателен за любой наводящий ответ.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566031
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
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 в сторону уменьшения пробовали?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566072
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
 return fIr$Tmp.nRes;


Да, аналогично: некорректное поведение.

Код: sql
1.
2.
3.
4.
5.
6.
alter session set plsql_optimize_level = 0;
alter package svc$23532pkg compile;

select svc$23532pkg.fIr$Tmp from dual
--------------------------------------
429514
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566095
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В dba_source что падает?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566096
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

на правах версии
переполняется "таблица констант"

если в конец пакета добавить еще одну ф-цию
fIr$Tmp2 с константой (напр 268435457),
они будут правильно работать?

ps
перемещая по телу пакета ф-цию, возможно можно определить когда перестает работать

.....
stax
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566098
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadВ dba_source что падает?
в source наверное все ок, а вот что в p-code вопрос

.....
stax
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566109
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadВ dba_source что падает?
В словаре все зачетно.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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;
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566129
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
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



все разное )
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566131
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пусть Вас не смущает название пакета BP$5024_PO_tmp, это и есть изначально указанный svc$23532pkg
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566141
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 Вы имели ввиду иное? Просветите, пжл, что это и как его позырить в БД.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566142
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ivan Rabashchenko,

а если сделать 268435457+0?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566146
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
хотя имхо надо сразу в корень проблемы смотреть
раз уж у вас Ivan Rabashchenkoавтоматическая генерациято почему бы просто несколько разных пакетов/функций не генерировать? гораздо удобнее бы вам стало
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566147
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderхотя имхо надо сразу в корень проблемы смотреть
раз уж у вас Ivan Rabashchenkoавтоматическая генерациято почему бы просто несколько разных пакетов/функций не генерировать? гораздо удобнее бы вам стало

Я с Вами полностью согласен, но генератор - священная корова. Да и цель иная: понять природу ошибки.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566150
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

А если
Код: plaintext
alter session set plsql_code_type = native;
и потом откомпилить?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566154
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderIvan Rabashchenko,

а если сделать 268435457+0?

Изменил штатную :

Код: plsql
1.
2.
3.
4.
5.
6.
function fIr$Tmp return number is
nRes number;
 begin        
    nRes :=  268435457+0;--power(2, 28);
    return nRes;
 end;



Переместил в середину пакета на строку 50 000 третий вариант:

Код: plsql
1.
2.
3.
4.
5.
6.
 function fIr$Tmp3 return number is
cRes CONSTANT number := 268435457;
nRes number;
 begin        
    return cRes;
 end;



Результат

Код: plsql
1.
2.
3.
4.
select SVC$23532PKG.fIR$Tmp as ver_0, SVC$23532PKG.fIR$Tmp3 as ver_3 from dual
----------------
VER_0    VER_3
429514    268435457



Т.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566156
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я про точку, ниже которой перестает работать функция
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566159
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566160
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.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566162
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopIvan Rabashchenko,

А если
Код: plaintext
alter session set plsql_code_type = native;
и потом откомпилить?

на MOSC сразу на это наткнулся. Мало чем помогло:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566165
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ivan Rabashchenko,

а перекомпиляция с включенным/выключенным дебагом тоже не помогает?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566166
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan RabashchenkoТ.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу.

возможно и другие ф-ции c константами после точки "невозврата" работают с "глюками"

ета простая и Вы сразу определили фичу

ps
как метод борьбы попробовать
в начале пакета добавить функцию "заглушку" с константами

.....
stax
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566170
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Расплющенная принцесса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 не нарываюсь.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566181
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжении об лимитах:

Код: plsql
1.
2.
3.
4.
select * from USER_OBJECT_SIZE where name = 'SVC$23532PKG'
-------------------------------------------------------------------------
SVC$23532PKG    PACKAGE                55787       160551       91580    0
SVC$23532PKG    PACKAGE BODY    5516957           6848    6959681    0



И по строкам в пакете (из той же доки):
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 и т.д.)
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566189
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderIvan Rabashchenko,

а перекомпиляция с включенным/выключенным дебагом тоже не помогает?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
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



Не помогло. Размер:

Код: plsql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566193
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxIvan RabashchenkoТ.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу.

возможно и другие ф-ции c константами после точки "невозврата" работают с "глюками"

ета простая и Вы сразу определили фичу

ps
как метод борьбы попробовать
в начале пакета добавить функцию "заглушку" с константами

.....
stax

Все верно, ниже определенной точки в пакете функции перестают корректно работать. Мой пример - упрощенная модель.

Вы писали: "как метод борьбы попробовать в начале пакета добавить функцию "заглушку" с константами"
Сори, не понял. Не могли бы Вы раскрыть тему? Просто в начале пакета сделать фейковую функцию вида:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
function fXXX return number is
 c1 CONSTANT number := 268435457;
 c2 CONSTANT number := 268435457;
 ...
 cn CONSTANT number := 268435457;
begin 
 return cn;
end;


?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566197
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko...Просто в начале пакета сделать фейковую функцию вида...
IMHO жесть какая
Не проще пакет на несколько пакетов разделить?

Ну и самый интересный вопрос: а что говорит Oracle Support на эту багу?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566240
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566242
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Леонид, нет не проще.
Для этого нужно изменить не только код генератора пакетов, но и всю парадигму системы, а это тьма кода, который работает поверх этих нелепых, неповоротливых, гигантских пакетов. К этому добавлю, что нарвались мы на этот bug только лишь у одного клиента (а их сонм), у которого и OS и БД знакомые (связка такая много у кого Solaris + 11.2.0.4) и затевать глобальный рефакторинг это очень смелый и дорогой шаг. Возможно, обойдемся малой кровью. Сначала решил сам поколупаться - не получилось (не хватает знания матчасти) , затем решил спросить умных людей (спасибо всем кто откликается), если решения не найдем, зарегим официальную ноту на Oracle Support.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566247
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderА эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет

Вполне возможно, на сегодня забрали доступ, завтра с утра предоставлю такую информацию.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566248
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

А можете попробовать с числом 268435455 и написать полученный результат?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566256
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLIvan Rabashchenko,

А можете попробовать с числом 268435455 и написать полученный результат?

Мне наверное стоило в моем первом комментарии уточнить вот такой факт:
Если оперировать не большими числами, например:

Код: plsql
1.
2.
3.
4.
5.
6.
function fIr$Tmp return number is
nRes number;
begin        
  nRes :=  268;
  return nRes;
end;



то все работает корректно независимо от положения в пакете. А если 268435456, например, то натыкаемся на некорректное поведение. Чтобы было понятнее, структура пакета такая:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
......
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 - норм.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566262
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Расплющенная принцесса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.
declare
   n           integer := 6551;
   spec_list   dbms_sql.varchar2a;
   body_list   dbms_sql.varchar2a;
   l_cursor    integer default dbms_sql.open_cursor;
   res         integer;
begin
   spec_list(1)                     := 'create or replace package pkg as';
   for i in 1 .. n
   loop
      spec_list(spec_list.count + 1):= 'function f' || i || ' return number;';
   end loop;
   spec_list(spec_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, spec_list, spec_list.first, spec_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);

   body_list(1)                     := 'create or replace package body pkg as';
   for i in 1 .. n
   loop
      body_list(body_list.count + 1):= 'function f' || i || ' return number as
                                        begin return ' || i || '; end;';
   end loop;
   body_list(body_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, body_list, body_list.first, body_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);
end;
/

PL/SQL procedure successfully completed.

select pkg.f6551 from dual;

     F6551
----------
      6551

declare
   n           integer := 6552;
   spec_list   dbms_sql.varchar2a;
   body_list   dbms_sql.varchar2a;
   l_cursor    integer default dbms_sql.open_cursor;
   res         integer;
begin
   spec_list(1)                     := 'create or replace package pkg as';
   for i in 1 .. n
   loop
      spec_list(spec_list.count + 1):= 'function f' || i || ' return number;';
   end loop;
   spec_list(spec_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, spec_list, spec_list.first, spec_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);

   body_list(1)                     := 'create or replace package body pkg as';
   for i in 1 .. n
   loop
      body_list(body_list.count + 1):= 'function f' || i || ' return number as
                                        begin return ' || i || '; end;';
   end loop;
   body_list(body_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, body_list, body_list.first, body_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);
end;
/

PL/SQL procedure successfully completed.

alter package pkg compile;

Warning: Package altered with compilation errors.

sho err
Errors for PACKAGE PKG:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1      PLS-00123: program too large (Diana nodes)


Linux, 11.2.0.4
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566263
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

А если включить
Код: plaintext
alter session set plsql_warnings = 'enable:all';
?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566269
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, только завтра смогу все проверить.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566285
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

еще можно попробовать дропнуть полностью пакет
и заново создать
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566289
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan RabashchenkoДля этого нужно изменить не только код генератора пакетов, но и всю парадигму системы, а это тьма кода, который работает поверх этих нелепых, неповоротливых, гигантских пакетов.
Как программист - не понимаю.

Если с размером specification проблем нет, а только с размером body, то никто не мешает точку входа в API оставить в одном пакете. Сделать пакет-прокси со старым именем, который просто будет вызывать функции из других пакетов. Код приложения, кроме генератора, менять не нужно

Единственная проблема чисто технического разделения - возможные связи между private (не вынесенные в спецификацию) функциями и глобальные переменные в пакете.

Лично я бы, первым делом, все глобальные переменные из пакета вынес в отдельный пакет (что бы на них всегда можно было ссылаться из всех генерированных пакетов), дальше бы разбирался, какие блоки функций можно отделить друг от друга. Сомневаюсь, что все 100 000 строк сгенерированного кода настолько сильно связаны друг с другом, что их не разделить.

Второе возможное решение, запрос в Oracle и фиксенье бага.

Поиск мелодии для бубна, который заставит обратно заработать систему у одного неудачливого заказчика.... это конечно хорошо, но как-то вызывает опасение. Если один раз свалилось на 100 000 строк кода, то кто может гарантировать, что в следующий раз не свалится на пакете в 101 000 строк кода и прошлогодняя мелодия и бубен поможет и в следующий раз?

IMHO & AFAIK
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566401
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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



Есть такое. Чем мне (нам) этот факт может помочь?

MaximaXXLIvan Rabashchenko,

А можете попробовать с числом 268435455 и написать полученный результат?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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



Ожидаемо, некорректный результат.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566406
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxIvan Rabashchenko,

еще можно попробовать дропнуть полностью пакет
и заново создать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566424
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

а так?
:)
Код: plsql
1.
2.
3.
4.
5.
6.
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
???
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566429
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxIvan Rabashchenko,

а так?
:)
Код: plsql
1.
2.
3.
4.
5.
6.
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
???



Намекаете, что drop не отрабатывает?

Код: plsql
1.
2.
3.
4.
5.
drop package SVC$23532PKG;

select SVC$23532PKG.fIr$Tmp from dual

ORA-00904: "SVC$23532PKG"."FIR$TMP": invalid identifier
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566431
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566438
Фотография -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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
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
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566445
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopIvan Rabashchenko,

А если включить
Код: plaintext
alter session set plsql_warnings = 'enable:all';
?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566451
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
declare
   n           integer := 6551;
   spec_list   dbms_sql.varchar2a;
   body_list   dbms_sql.varchar2a;
   l_cursor    integer default dbms_sql.open_cursor;
   res         integer;
begin
   spec_list(1)                     := 'create or replace package pkg as';
   for i in 1 .. n
   loop
      spec_list(spec_list.count + 1):= 'function f' || i || ' return number;';
   end loop;
   spec_list(spec_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, spec_list, spec_list.first, spec_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);

   body_list(1)                     := 'create or replace package body pkg as';
   for i in 1 .. n
   loop
      body_list(body_list.count + 1):= 'function f' || i || ' return number as
                                        begin return ' || i || '; end;';
   end loop;
   body_list(body_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, body_list, body_list.first, body_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);
end;
/

PL/SQL procedure successfully completed.

select pkg.f6551 from dual;

     F6551
----------
      6551

declare
   n           integer := 6552;
   spec_list   dbms_sql.varchar2a;
   body_list   dbms_sql.varchar2a;
   l_cursor    integer default dbms_sql.open_cursor;
   res         integer;
begin
   spec_list(1)                     := 'create or replace package pkg as';
   for i in 1 .. n
   loop
      spec_list(spec_list.count + 1):= 'function f' || i || ' return number;';
   end loop;
   spec_list(spec_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, spec_list, spec_list.first, spec_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);

   body_list(1)                     := 'create or replace package body pkg as';
   for i in 1 .. n
   loop
      body_list(body_list.count + 1):= 'function f' || i || ' return number as
                                        begin return ' || i || '; end;';
   end loop;
   body_list(body_list.count + 1)   := 'end;';
   dbms_sql.parse(l_cursor, body_list, body_list.first, body_list.last, true, dbms_sql.native);
   res                              := dbms_sql.execute(l_cursor);
end;
/

PL/SQL procedure successfully completed.

alter package pkg compile;

Warning: Package altered with compilation errors.

sho err
Errors for PACKAGE PKG:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1      PLS-00123: program too large (Diana nodes)


Linux, 11.2.0.4

Указанный вам пример порождает PLS-00123 и у меня на разных платформах (Win\Linus\Solaris + 11.2.0.4\12.1.0.2)
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566454
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566462
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит.

О, это уже горячо. Уважаемый, -2-, подскажите пжл документ, в котором указано такое ограничение.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566466
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxIvan Rabashchenko,

на правах версии
переполняется "таблица констант"

если в конец пакета добавить еще одну ф-цию
fIr$Tmp2 с константой (напр 268435457),
они будут правильно работать?

ps
перемещая по телу пакета ф-цию, возможно можно определить когда перестает работать

.....
stax

Мне сразу дали намек, а его не понял...
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566482
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
-2-,

Имхо не хэш а переполнение индекса
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566487
Читаем доки
PL/SQL Program Limits
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566516
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
-2-Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит.
Имхо как-то так должно быть:-2-Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Для оптимизации, константы Более 16 бит заносятся в некий массив, а вместо константы указывается ее индекс в этой таблице. На выполнении из-за переполнения из массива выбирается по индексу младших 15/16 бит.


PL/SQL Program LimitsЧитаем доки
PL/SQL Program Limits лимита на количество литералов там нет
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566526
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
допустим ошибка из-за переполнения таблицы констант. Тогда как объяснить это:
Я создал в пакете две функции:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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
Результат:

Код: plsql
1.
2.
3.
4.
select SVC$23532PKG.fIr$Tmp fIr$Tmp,SVC$23532PKG.fIr$Tmp2 fIr$Tmp2 from dual
----------------------------------------------------------------
fIr$Tmp   fIr$Tmp2
26843     429514



Другими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566529
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

Может у Вас есть в пакете функция nRes которая возвращает number?
И при return nRes; результат отдается не переменной а функции?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566532
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLIvan Rabashchenko,

Может у Вас есть в пакете функция nRes которая возвращает number?
И при return nRes; результат отдается не переменной а функции?

Код: plsql
1.
2.
3.
4.
5.
6.
select * from all_procedures
where owner = 'COLVIR'
  and object_name = 'SVC$23532PKG' 
  and UPPER(procedure_name) like '%NRES%'
------
0 records found
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566534
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

А если так?
Код: plsql
1.
2.
3.
4.
function fIr$Tmp return number is
begin        
return 268435457;
end; 
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566535
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ivan RabashchenkoДругими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете.так -2- написал же 21017332 и даже показал.
с небольшой правкой от меня: 21017730
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566543
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
если объяснить его пример простыми словами, то:
-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.
declare n number;
begin
-- таблица контант заполняется этими значениями:
 n := 1000001; 
 n := 1000002;
...
 n := 1032766;
 n := 1032767;
-- т.е. таблицу уже добавили 32767 значений от 1000001 до 1032767.
 dbms_output.put_line('32770='||32770); -- здесь мы добавляем в таблицу еще одно значение (32770),
                                        -- а вместо него подставляется его индекс, т.е. 32768 (32767+1), 
                                        -- но при выполнении из-за переполнения индекса, оракл достанет по индексу 1.
 dbms_output.put_line('32769='||32769); -- здесь то же самое но индекс будет 2
 dbms_output.put_line('32768='||32768); -- здесь то же самое но индекс будет 3
 dbms_output.put_line('32767='||32767); -- значение здесь вписывается в ограничение, поэтому в таблицу констант добавлено не будет, а будет использоваться его реальное значение
 dbms_output.put_line('1000001='||1000001); -- здесть индекс будет 4
 dbms_output.put_line('1032767='||1032767); -- здесть индекс будет 5
end;
/

32770=0
32769=1000001
32768=1000002
32767=32767
1000001=1000003
1032767=1000004



тестовый код
Код: 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.
declare
   c clob:='declare n number;begin'||chr(10);
   f varchar2(100):='n:=%s;'||chr(10);
   v varchar2(32767);
   n number:=32768;
begin
   for i in 1..n loop
      v:=v||utl_lms.format_message(f,to_char(1e7+i));
      if length(v)>30000 then
         c:=c||v;
         v:='';
      end if;
   end loop;
   v:=v||q'[
    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);
    dbms_output.put_line('1000001='||1000001);
    dbms_output.put_line('1050000='||1050000);
   end;
   ]';
   c:=c||v;
   --dbms_output.put_line(c);
   execute immediate c;
end;
/

...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566564
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо огромное за разъяснения.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566588
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.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566622
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566645
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL/SQL Program Limits,

Ошибка то где? Хотя бы даже ORA-600....
Бага она и есть бага. Т.ч. документация идет лесом. IMHO
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566658
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помню, был в 1996 некий анализ еще клипперного ПО
там тоже упирались в количество переменных
Предлагали делать массивом, один массив на все тыщи переменных

Т.е. в нашем случае - сделать коллекцию констант
Правда, для заполнения коллекции придется ее теми же константами и заполнять... которые надо где-то хранить
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566667
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
PL/SQL Program LimitsПод вот это не попадает?не попадает
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566689
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

таблица констант - только для чисел?
n varchar2(20); - как в этом случае повторить пример


спасибо
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566700
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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.
with obj as (
   select 
      object_type,owner,object_name,object_id obj#
   from dba_objects  
   where owner like nvl(upper('&owner'),'%')
     and object_type like nvl(upper('&type'),'%')
     and object_name like nvl(upper('&name'),'%')
)
select o.object_name
      ,o.object_type
      ,u1.part
      ,decode(part
             ,0,'diana'
             ,1,'portable pcode'
             ,2,'machine-dependent pcode'
             ) part_s
      ,version
      ,piece#
      ,length
      ,piece
from obj o
    ,sys.Idl_Ub1$ u1 
where u1.obj#=o.obj#
/

подробности: https://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Finnigan.pdf

если не ошибаюсь #xxx и есть индекс константы
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566703
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
with obj as (
   select 
      object_type,owner,object_name,object_id obj#
   from dba_objects  
   where owner like nvl(upper('&owner'),'%')
     and object_type like nvl(upper('&type'),'%')
     and object_name like nvl(upper('&name'),'%')
)
select o.object_name
      ,o.object_type
      ,u1.part
      ,decode(part
             ,0,'diana'
             ,1,'portable pcode'
             ,2,'machine-dependent pcode'
             ) part_s
      ,version
      ,piece#
      ,length
      ,piece
from obj o
    ,sys.Idl_Ub1$ u1 
where u1.obj#=o.obj#
/

подробности: https://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Finnigan.pdf

если не ошибаюсь #xxx и есть индекс константы

Нужно, чтобы понять, насколько критично кол-во констант в пакете.
Спасибо за помощь.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566706
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dba123xtender,

таблица констант - только для чисел?
n varchar2(20); - как в этом случае повторить пример


спасибос varchar2 такой оптимизации нет
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566713
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

Так генератор поправить можно?
Код: plsql
1.
2.
3.
4.
5.
6.
function fIr$Tmp return number is
nRes number;
begin        
  select 268435456 into nRes from dual;
  return nRes;
end;
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566715
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ivan Rabashchenko,

тогда уж так проще было бы:
Код: plsql
1.
2.
select sum(regexp_count(text,'(\W|^)\d+(\.\d+)?(\W|$)',1)) nums_count 
from user_source s where name='&package' and type='PACKAGE BODY'
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566718
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env,

уж проще было бы просто to_number '268435456' без запроса
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566721
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderс varchar2 такой оптимизации нетИнтересно, как отработает с неявным преобразованием и plsql_optimize_level, скажем, равным нулю:
Код: plsql
1.
return '268435457';
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566723
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad,

да нормально должно... можешь попробовать на основе этого теста: 21017939
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566724
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

В лом). Пусть автор пробует, в качестве workaround это для него самый быстрый вариант.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566732
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadxtender,

В лом). Пусть автор пробует, в качестве workaround это для него самый быстрый вариант.

Спасибо за workaround!
return 'xxxxxxxxxx' норм вариант
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566733
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan RabashchenkoСпасибо за workaround!
return 'xxxxxxxxxx' норм вариантБлагодари -2-, это он разгадал особенности компиляции PL/SQL кода.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566735
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
), -2- , xtender и всем всем огромное спасибо еще раз.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566762
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
все проще: надо просто добавить .0 к константам, т.е. тупо
Код: plsql
1.
n:=268435457.0;
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566763
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
можно даже сократить до точкиxtenderвсе проще: надо просто добавить .0 к константам, т.е. тупо
Код: plsql
1.
n:=268435457.;
...
Рейтинг: 0 / 0
77 сообщений из 77, показаны все 4 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]