Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк / 25 сообщений из 77, страница 1 из 4
07.12.2017, 15:54
    #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
07.12.2017, 16:19
    #39566031
env
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
07.12.2017, 16:58
    #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
07.12.2017, 17:21
    #39566095
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение переменных в пакетах, с большим количеством строк
В dba_source что падает?
...
Рейтинг: 0 / 0
07.12.2017, 17:22
    #39566096
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение переменных в пакетах, с большим количеством строк
Ivan Rabashchenko,

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

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

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

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

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

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

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

А если
Код: plaintext
alter session set plsql_code_type = native;
и потом откомпилить?
...
Рейтинг: 0 / 0
07.12.2017, 18:30
    #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
07.12.2017, 18:31
    #39566156
Ivan Rabashchenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение переменных в пакетах, с большим количеством строк
я про точку, ниже которой перестает работать функция
...
Рейтинг: 0 / 0
07.12.2017, 18:35
    #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
07.12.2017, 18:35
    #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
07.12.2017, 18:37
    #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
07.12.2017, 18:42
    #39566165
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение переменных в пакетах, с большим количеством строк
Ivan Rabashchenko,

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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
07.12.2017, 18:51
    #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
07.12.2017, 19:06
    #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
07.12.2017, 19:20
    #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
07.12.2017, 19:25
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк / 25 сообщений из 77, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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