Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Странное поведение переменных в пакетах, с большим количеством строк  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5802
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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
AmKad
Member

Откуда:
Сообщений: 4850
В dba_source что падает?
7 дек 17, 17:21    [21015953]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
Ivan Rabashchenko,

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

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

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

.....
stax
7 дек 17, 17:22    [21015954]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
AmKad
В dba_source что падает?

в source наверное все ок, а вот что в p-code вопрос

.....
stax
7 дек 17, 17:24    [21015964]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
AmKad
В dba_source что падает?

В словаре все зачетно.

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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
Stax
Ivan Rabashchenko,

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

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

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

.....
stax


Добавил две функции после штатной:

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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
Пусть Вас не смущает название пакета BP$5024_PO_tmp, это и есть изначально указанный svc$23532pkg
7 дек 17, 17:59    [21016096]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
Stax
AmKad
В 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 Вы имели ввиду иное? Просветите, пжл, что это и как его позырить в БД.
7 дек 17, 18:16    [21016130]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4921
Ivan Rabashchenko,

а если сделать 268435457+0?
7 дек 17, 18:16    [21016132]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4921
хотя имхо надо сразу в корень проблемы смотреть
раз уж у вас
Ivan Rabashchenko
автоматическая генерация
то почему бы просто несколько разных пакетов/функций не генерировать? гораздо удобнее бы вам стало
7 дек 17, 18:22    [21016151]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
xtender
хотя имхо надо сразу в корень проблемы смотреть
раз уж у вас
Ivan Rabashchenko
автоматическая генерация
то почему бы просто несколько разных пакетов/функций не генерировать? гораздо удобнее бы вам стало


Я с Вами полностью согласен, но генератор - священная корова. Да и цель иная: понять природу ошибки.
7 дек 17, 18:26    [21016161]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5056
Ivan Rabashchenko,

А если
alter session set plsql_code_type = native;
и потом откомпилить?
7 дек 17, 18:27    [21016165]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
xtender
Ivan Rabashchenko,

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


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

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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
я про точку, ниже которой перестает работать функция
7 дек 17, 18:31    [21016177]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
Ivan Rabashchenko
Stax
пропущено...

в 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
7 дек 17, 18:35    [21016190]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Расплющенная принцесса
Guest
Ivan Rabashchenko
Starting 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.
7 дек 17, 18:35    [21016191]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
dbms_photoshop
Ivan Rabashchenko,

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


на 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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4921
Ivan Rabashchenko,

а перекомпиляция с включенным/выключенным дебагом тоже не помогает?
7 дек 17, 18:42    [21016209]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1106
Ivan Rabashchenko
Т.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу.


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

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

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

.....
stax
7 дек 17, 18:43    [21016211]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
Расплющенная принцесса
Ivan Rabashchenko
Starting 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 не нарываюсь.
7 дек 17, 18:51    [21016247]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
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


И по строкам в пакете (из той же доки):
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 и т.д.)
7 дек 17, 19:06    [21016306]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
xtender
Ivan Rabashchenko,

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


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]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
Stax
Ivan Rabashchenko
Т.е с поднятием вверх по пакету функция начинает работать верно. Я могу, конечно, найти эту точку, но это мало чем поможет, хотя если кому-то эта информация поможет, готов проделать эту работу.


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

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

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

.....
stax


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

Вы писали: "как метод борьбы попробовать в начале пакета добавить функцию "заглушку" с константами"
Сори, не понял. Не могли бы Вы раскрыть тему? Просто в начале пакета сделать фейковую функцию вида:
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Oracle Ответить