powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк
25 сообщений из 77, страница 3 из 4
Странное поведение переменных в пакетах, с большим количеством строк
    #39566526
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
допустим ошибка из-за переполнения таблицы констант. Тогда как объяснить это:
Я создал в пакете две функции:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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
Результат:

Код: plsql
1.
2.
3.
4.
select SVC$23532PKG.fIr$Tmp fIr$Tmp,SVC$23532PKG.fIr$Tmp2 fIr$Tmp2 from dual
----------------------------------------------------------------
fIr$Tmp   fIr$Tmp2
26843     429514



Другими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566529
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

Может у Вас есть в пакете функция nRes которая возвращает number?
И при return nRes; результат отдается не переменной а функции?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566532
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLIvan Rabashchenko,

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

Код: plsql
1.
2.
3.
4.
5.
6.
select * from all_procedures
where owner = 'COLVIR'
  and object_name = 'SVC$23532PKG' 
  and UPPER(procedure_name) like '%NRES%'
------
0 records found
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566534
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

А если так?
Код: plsql
1.
2.
3.
4.
function fIr$Tmp return number is
begin        
return 268435457;
end; 
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566535
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ivan RabashchenkoДругими словами, если возвращаемое значение меньше определенной величины, то все корректно независимо от положения в пакете.так -2- написал же 21017332 и даже показал.
с небольшой правкой от меня: 21017730
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566543
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
если объяснить его пример простыми словами, то:
-2-
Код: 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.
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



тестовый код
Код: 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.
27.
28.
29.
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;
/

...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566564
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо огромное за разъяснения.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566588
xtenderPL/SQL Program LimitsЧитаем доки
PL/SQL Program Limits лимита на количество литералов там нет
Под вот это не попадает?

ItemLimitbind 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.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566622
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566645
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL/SQL Program Limits,

Ошибка то где? Хотя бы даже ORA-600....
Бага она и есть бага. Т.ч. документация идет лесом. IMHO
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566658
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помню, был в 1996 некий анализ еще клипперного ПО
там тоже упирались в количество переменных
Предлагали делать массивом, один массив на все тыщи переменных

Т.е. в нашем случае - сделать коллекцию констант
Правда, для заполнения коллекции придется ее теми же константами и заполнять... которые надо где-то хранить
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566667
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
PL/SQL Program LimitsПод вот это не попадает?не попадает
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566689
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

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


спасибо
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566700
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ivan RabashchenkoЕсли я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?да зачем это вам надо?
Если уж сильно интересно поковыряться, то тут:
Код: 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.
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 и есть индекс константы
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566703
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderIvan RabashchenkoЕсли я правильно понял, заполненная таблица констант живет после компиляции где-то в БД. А где именно она в БД живет?да зачем это вам надо?
Если уж сильно интересно поковыряться, то тут:
Код: 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.
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 и есть индекс константы

Нужно, чтобы понять, насколько критично кол-во констант в пакете.
Спасибо за помощь.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566706
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dba123xtender,

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


спасибос varchar2 такой оптимизации нет
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566713
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Rabashchenko,

Так генератор поправить можно?
Код: plsql
1.
2.
3.
4.
5.
6.
function fIr$Tmp return number is
nRes number;
begin        
  select 268435456 into nRes from dual;
  return nRes;
end;
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566715
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ivan Rabashchenko,

тогда уж так проще было бы:
Код: plsql
1.
2.
select sum(regexp_count(text,'(\W|^)\d+(\.\d+)?(\W|$)',1)) nums_count 
from user_source s where name='&package' and type='PACKAGE BODY'
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566718
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env,

уж проще было бы просто to_number '268435456' без запроса
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566721
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderс varchar2 такой оптимизации нетИнтересно, как отработает с неявным преобразованием и plsql_optimize_level, скажем, равным нулю:
Код: plsql
1.
return '268435457';
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566723
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmKad,

да нормально должно... можешь попробовать на основе этого теста: 21017939
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566724
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

В лом). Пусть автор пробует, в качестве workaround это для него самый быстрый вариант.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566732
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadxtender,

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

Спасибо за workaround!
return 'xxxxxxxxxx' норм вариант
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566733
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan RabashchenkoСпасибо за workaround!
return 'xxxxxxxxxx' норм вариантБлагодари -2-, это он разгадал особенности компиляции PL/SQL кода.
...
Рейтинг: 0 / 0
Странное поведение переменных в пакетах, с большим количеством строк
    #39566735
Ivan Rabashchenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
), -2- , xtender и всем всем огромное спасибо еще раз.
...
Рейтинг: 0 / 0
25 сообщений из 77, страница 3 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение переменных в пакетах, с большим количеством строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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