powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк
25 сообщений из 77, страница 1 из 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
25 сообщений из 77, страница 1 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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