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

Откуда: Киев
Сообщений: 594
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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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