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

Откуда: Россия, Москва
Сообщений: 5880
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

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

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

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

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

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

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

Откуда: Ukraine,Lviv
Сообщений: 1373
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

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

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

Откуда: Мск
Сообщений: 4944
хотя имхо надо сразу в корень проблемы смотреть
раз уж у вас
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
Сообщений: 5149
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
Сообщений: 1373
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

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

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

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

Откуда:
Сообщений: 7156
Ivan Rabashchenko
...Просто в начале пакета сделать фейковую функцию вида...

IMHO жесть какая
Не проще пакет на несколько пакетов разделить?

Ну и самый интересный вопрос: а что говорит Oracle Support на эту багу?
7 дек 17, 19:38    [21016381]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет
7 дек 17, 20:41    [21016535]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
Леонид, нет не проще.
Для этого нужно изменить не только код генератора пакетов, но и всю парадигму системы, а это тьма кода, который работает поверх этих нелепых, неповоротливых, гигантских пакетов. К этому добавлю, что нарвались мы на этот bug только лишь у одного клиента (а их сонм), у которого и OS и БД знакомые (связка такая много у кого Solaris + 11.2.0.4) и затевать глобальный рефакторинг это очень смелый и дорогой шаг. Возможно, обойдемся малой кровью. Сначала решил сам поколупаться - не получилось (не хватает знания матчасти) , затем решил спросить умных людей (спасибо всем кто откликается), если решения не найдем, зарегим официальную ноту на Oracle Support.
7 дек 17, 20:48    [21016549]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
xtender
А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет


Вполне возможно, на сегодня забрали доступ, завтра с утра предоставлю такую информацию.
7 дек 17, 20:54    [21016559]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 618
Ivan Rabashchenko,

А можете попробовать с числом 268435455 и написать полученный результат?
7 дек 17, 20:54    [21016561]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

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

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


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

function fIr$Tmp return number is
nRes number;
begin        
  nRes :=  268;
  return nRes;
end;


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

......
function fIr$Tmp_110 return number is 
nRes number;
begin        
  nRes :=  268435456;
  return nRes;
end;
function fIr$Tmp_111 return number is 
nRes number;
begin        
  nRes :=  268;
  return nRes;
end;
function fIr$Tmp_112 return number is 
nRes number;
begin        
  nRes :=  268435457;
  return nRes;
end;
......



и получается, что fIr$Tmp_110 и fIr$Tmp_112 возвращают ересь, а fIr$Tmp_111 - норм.
7 дек 17, 21:16    [21016591]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
Расплющенная принцесса
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.

+ И она даже возникает.

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

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

А если включить
alter session set plsql_warnings = 'enable:all';
?
7 дек 17, 21:35    [21016619]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
К сожалению, только завтра смогу все проверить.
7 дек 17, 21:48    [21016641]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 48794
Ivan Rabashchenko,

еще можно попробовать дропнуть полностью пакет
и заново создать
7 дек 17, 22:44    [21016785]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7156
Ivan Rabashchenko
Для этого нужно изменить не только код генератора пакетов, но и всю парадигму системы, а это тьма кода, который работает поверх этих нелепых, неповоротливых, гигантских пакетов.

Как программист - не понимаю.

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

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

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

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

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

IMHO & AFAIK
7 дек 17, 23:06    [21016822]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
xtender
А эти неправильные значения в коде не встречаются случайно? Может тупо переполнение индекса идет

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


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

MaximaXXL
Ivan Rabashchenko,

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


function fIr$Tmp return number is
nRes number;
 begin        
    nRes :=  268435455;
    return nRes;
 end;
 
select SVC$23532PKG.fIR$Tmp as ver_0 from dual
-------
 VER_0
 429514


Ожидаемо, некорректный результат.
8 дек 17, 09:40    [21017216]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

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

еще можно попробовать дропнуть полностью пакет
и заново создать

drop package SVC$23532PKG;   
create or replace package SVC$23532PKG as...
create or replace package body SVC$23532PKG as...
    
select SVC$23532PKG.fIR$Tmp as ver_0 from dual
-------
 VER_0
 429514
8 дек 17, 09:48    [21017236]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 48794
Ivan Rabashchenko,

а так?
:)
drop package SVC$23532PKG;   
--create or replace package SVC$23532PKG as...
--create or replace package body SVC$23532PKG as...
    
select SVC$23532PKG.fIR$Tmp as ver_0 from dual
???
8 дек 17, 10:07    [21017280]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

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

а так?
:)
drop package SVC$23532PKG;   
--create or replace package SVC$23532PKG as...
--create or replace package body SVC$23532PKG as...
    
select SVC$23532PKG.fIR$Tmp as ver_0 from dual
???


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

drop package SVC$23532PKG;

select SVC$23532PKG.fIr$Tmp from dual

ORA-00904: "SVC$23532PKG"."FIR$TMP": invalid identifier
8 дек 17, 10:25    [21017320]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
-2-
Member

Откуда:
Сообщений: 13976
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит.
8 дек 17, 10:31    [21017332]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
-2-
Member

Откуда:
Сообщений: 13976
set serveroutput on
declare
   c clob;
begin
   c := 'declare n number;begin'||chr(10);
   for i in 1..32768 loop
      c := c || ' n := ' || to_char(i+1000000) || ';' || chr(10);
   end loop;
   c := c || ' dbms_output.put_line(''n=''||n);' || chr(10);
   c := c || 'end;' || chr(10);
   dbms_output.put_line(substr(c, -53));
   execute immediate c;
end;
/

-- 32767/+1000000
 n := 1032767;
 dbms_output.put_line('n='||n);
end;

n=1032767

-- 32768/+1000000
 n := 1032768;
 dbms_output.put_line('n='||n);
end;

n=0

-- 32768/+0
 n := 32768;
 dbms_output.put_line('n='||n);
end;

n=32768
8 дек 17, 10:43    [21017369]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

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

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


alter session set plsql_warnings = 'enable:all';
alter package SVC$23532PKG compile;

select  text, count(1) from dba_errors where name = 'SVC$23532PKG'  group by text
-----
PLW-06010: keyword "RESULT" used as a defined name	149
PLW-07203: parameter 'OP' may benefit from use of the NOCOPY compiler hint	1452
PLW-06002: Unreachable code	473
PLW-05018: unit SVC$23532PKG omitted optional AUTHID clause; default value DEFINER used	1
8 дек 17, 10:49    [21017401]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
dbms_photoshop
Расплющенная принцесса
пропущено...
Это откуда? Смотри в доке plsql лимиты, там есть что посчитать. По объему parsed_code грозятся ошибкой pls-123.

+ И она даже возникает.

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

Откуда:
Сообщений: 13976
declare n number;
begin
 n := 1000001;
 n := 1000002;
...
 n := 1032766;
 n := 1032767;
 dbms_output.put_line('32770='||32770);
 dbms_output.put_line('32769='||32769);
 dbms_output.put_line('32768='||32768);
 dbms_output.put_line('32767='||32767);
 dbms_output.put_line('1000001='||1000001);
 dbms_output.put_line('1032767='||1032767);
end;
/

32770=0
32769=1000001
32768=1000002
32767=32767
1000001=1000003
1032767=1000004
8 дек 17, 11:06    [21017447]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
-2-
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит.


О, это уже горячо. Уважаемый, -2-, подскажите пжл документ, в котором указано такое ограничение.
8 дек 17, 11:15    [21017475]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

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

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

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

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

.....
stax


Мне сразу дали намек, а его не понял...
8 дек 17, 11:21    [21017498]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
-2-,

Имхо не хэш а переполнение индекса
8 дек 17, 11:36    [21017576]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
PL/SQL Program Limits
Guest
Читаем доки
PL/SQL Program Limits
8 дек 17, 11:48    [21017618]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
-2-
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Более 16 бит заносится в некую хеш-таблицу. При превышении количества 32767/65535 констант результат парса теряется. На выполнении из хеш-таблицы выбирается по индексу младших 15/16 бит.

Имхо как-то так должно быть:
-2-
Предполагаю, что проблема в количестве констант (нод). Возможно малая константа имеет в пкоде "непосредственную адресацию". Для оптимизации, константы Более 16 бит заносятся в некий массив, а вместо константы указывается ее индекс в этой таблице. На выполнении из-за переполнения из массива выбирается по индексу младших 15/16 бит.



PL/SQL Program Limits
Читаем доки
PL/SQL Program Limits
лимита на количество литералов там нет
8 дек 17, 12:24    [21017730]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
допустим ошибка из-за переполнения таблицы констант. Тогда как объяснить это:
Я создал в пакете две функции:

select line, name, text from all_source where owner = 'COLVIR' and name = 'SVC$23532PKG' and type = 'PACKAGE BODY' and line > 97825 order by line
LINE      NAME               TEXT
------------------------------------------------------------
97826 SVC$23532PKG  "function fIr$Tmp2 return number is
97827 SVC$23532PKG  "nRes number;
97828 SVC$23532PKG  " begin        
97829 SVC$23532PKG  "    nRes := 268435457;
97830 SVC$23532PKG  "    return nRes;
97831 SVC$23532PKG  " end; 
97832 SVC$23532PKG  "function fIr$Tmp return number is
97833 SVC$23532PKG  "nRes number;
97834 SVC$23532PKG  " begin       
97835 SVC$23532PKG  "    nRes :=  26843;
97836 SVC$23532PKG  "    return nRes;
97837 SVC$23532PKG  " end;
97838 SVC$23532PKG  "END SVC$23532PKG;


та что выше ( fIr$Tmp2) пытается вернуть 268435457, а та что ниже (fIr$Tmp) - 26843
Результат:

select SVC$23532PKG.fIr$Tmp fIr$Tmp,SVC$23532PKG.fIr$Tmp2 fIr$Tmp2 from dual
----------------------------------------------------------------
fIr$Tmp   fIr$Tmp2
26843     429514


Другими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете.
8 дек 17, 12:42    [21017845]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 618
Ivan Rabashchenko,

Может у Вас есть в пакете функция nRes которая возвращает number?
И при return nRes; результат отдается не переменной а функции?
8 дек 17, 12:46    [21017868]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

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

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


select * from all_procedures
where owner = 'COLVIR'
  and object_name = 'SVC$23532PKG' 
  and UPPER(procedure_name) like '%NRES%'
------
0 records found
8 дек 17, 12:49    [21017886]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 618
Ivan Rabashchenko,

А если так?
function fIr$Tmp return number is
begin        
return 268435457;
end; 
8 дек 17, 12:54    [21017910]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
Ivan Rabashchenko
Другими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете.
так -2- написал же 21017332 и даже показал.
с небольшой правкой от меня:21017730
8 дек 17, 12:54    [21017911]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
если объяснить его пример простыми словами, то:
-2-
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


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

Откуда: Minsk
Сообщений: 35
Спасибо огромное за разъяснения.
8 дек 17, 13:33    [21018046]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
PL/SQL Program Limits
Guest
xtender
PL/SQL Program Limits
Читаем доки
PL/SQL Program Limits
лимита на количество литералов там нет

Под вот это не попадает?

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

Откуда: Minsk
Сообщений: 35
Если я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?
8 дек 17, 14:22    [21018279]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7156
PL/SQL Program Limits,

Ошибка то где? Хотя бы даже ORA-600....
Бага она и есть бага. Т.ч. документация идет лесом. IMHO
8 дек 17, 14:38    [21018377]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 48794
помню, был в 1996 некий анализ еще клипперного ПО
там тоже упирались в количество переменных
Предлагали делать массивом, один массив на все тыщи переменных

Т.е. в нашем случае - сделать коллекцию констант
Правда, для заполнения коллекции придется ее теми же константами и заполнять... которые надо где-то хранить
8 дек 17, 14:47    [21018454]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
PL/SQL Program Limits
Под вот это не попадает?
не попадает
8 дек 17, 15:00    [21018505]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
dba123
Member

Откуда:
Сообщений: 1044
xtender,

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


спасибо
8 дек 17, 15:21    [21018577]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
Ivan Rabashchenko
Если я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?
да зачем это вам надо?
Если уж сильно интересно поковыряться, то тут:
+
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 и есть индекс константы
8 дек 17, 15:31    [21018632]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
xtender
Ivan Rabashchenko
Если я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?
да зачем это вам надо?
Если уж сильно интересно поковыряться, то тут:
+
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 и есть индекс константы


Нужно, чтобы понять, насколько критично кол-во констант в пакете.
Спасибо за помощь.
8 дек 17, 15:39    [21018660]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
dba123
xtender,

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


спасибо
с varchar2 такой оптимизации нет
8 дек 17, 15:40    [21018665]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
env
Member

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

Так генератор поправить можно?
function fIr$Tmp return number is
nRes number;
begin        
  select 268435456 into nRes from dual;
  return nRes;
end;
8 дек 17, 15:50    [21018721]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

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

тогда уж так проще было бы:
select sum(regexp_count(text,'(\W|^)\d+(\.\d+)?(\W|$)',1)) nums_count 
from user_source s where name='&package' and type='PACKAGE BODY'
8 дек 17, 15:51    [21018724]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
env,

уж проще было бы просто to_number '268435456' без запроса
8 дек 17, 15:53    [21018736]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
AmKad
Member

Откуда:
Сообщений: 4906
xtender
с varchar2 такой оптимизации нет
Интересно, как отработает с неявным преобразованием и plsql_optimize_level, скажем, равным нулю:
return '268435457';
8 дек 17, 15:56    [21018748]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
AmKad,

да нормально должно... можешь попробовать на основе этого теста: 21017939
8 дек 17, 15:59    [21018768]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
AmKad
Member

Откуда:
Сообщений: 4906
xtender,

В лом). Пусть автор пробует, в качестве workaround это для него самый быстрый вариант.
8 дек 17, 16:00    [21018776]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

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

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


Спасибо за workaround!
return 'xxxxxxxxxx' норм вариант
8 дек 17, 16:14    [21018831]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
AmKad
Member

Откуда:
Сообщений: 4906
Ivan Rabashchenko
Спасибо за workaround!
return 'xxxxxxxxxx' норм вариант
Благодари -2-, это он разгадал особенности компиляции PL/SQL кода.
8 дек 17, 16:19    [21018852]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
Ivan Rabashchenko
Member

Откуда: Minsk
Сообщений: 35
), -2- , xtender и всем всем огромное спасибо еще раз.
8 дек 17, 16:27    [21018875]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
все проще: надо просто добавить .0 к константам, т.е. тупо
n:=268435457.0;
8 дек 17, 17:26    [21019020]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение переменных в пакетах, с большим количеством строк  [new]
xtender
Member

Откуда: Мск
Сообщений: 4944
можно даже сократить до точки
xtender
все проще: надо просто добавить .0 к константам, т.е. тупо
n:=268435457.;
8 дек 17, 17:29    [21019029]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Oracle Ответить