powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
15 сообщений из 40, страница 2 из 2
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409194
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnetДумаю, константа или не константа - не повлияет на механизм , управляющий состоянием пакета.Думать - это хорошо, однако и это тоже нужно уметь делать правильно.
RTFM Package Treated as Stateless if State is Constant for Life of Session (FAQ)
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409200
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintпочему надо именно F_NEW CONSTANT VARCHAR2(20) = 'F_NEW'; и потом использовать переменную F_NEW вместо того чтобы просто не написать 'F_NEW'?
хоть раз за все время проекта такая константа менялась и вам действительно приходилось менять ее значение после выкатки в продакшн?Ошибки в написании одной и той же именованной константы в разных местах использования отлавливаются на ранних стадиях компилятором.
Говнокод же с ошибками в литералах может жить вечно, не догадываясь о своей говнокодистости.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409208
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,
я задал вполне конкретные вопросы автору опуса, зачем ты можешь использовать константы я и сам могу придумать)
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409244
Ask
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ask
Гость
ElicfortnetДумаю, константа или не константа - не повлияет на механизм , управляющий состоянием пакета.Думать - это хорошо, однако и это тоже нужно уметь делать правильно.
RTFM Package Treated as Stateless if State is Constant for Life of Session (FAQ)
Реально даже в 11.2.0.2 varchar2 константы делают пакет stateful. А вот number, да разрешили.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409298
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

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

И вообще как при изменении пакета, сделать так, что бы пользователю не валилась ошибка о недоступности функции пакета.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409299
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vint,

Пакет используется на разных рабочих базах, и на каждой функция возвращает свое значение.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409323
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gogol Написал пакет, некоторые значения, которые часто используются и возвращаются функцией (отличаются от базы к базе) вынес в глобальные переменные. Есть проблема что пакет очень часто меняет состояние. Есть подозрение что проблема из-за глобальных переменных.


Вообщем то, можно решить двумя путями -
1. Не рекомпилировать package body + не инвалидировать если пакет stateful.
2. Сделать пакет stateless, почитав для этого https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#LNPLS804 , чтобы понять какие компоненты пакета и при каких условиях (напр. "Therefore, a package that is stateless when compiled at one optimization level might be stateful when compiled at a different optimization level") делают его stateful.

GogolПоэтому хочу узнать, поможет ли замена констант на функции.
Нет
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409324
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gogolчасто меняет состояниеНе надо перевирать своими словами. Излагай факты.
GogolЕсть подозрение что проблема из-за глобальных переменных.Это не причина.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39409328
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GogolИ вообще как при изменении пакета, сделать так, что бы пользователю не валилась ошибка о недоступности функции пакета.

??
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39410568
Ask
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ask
Гость
Вот тут еще про то что официальная документация несколько недоговаривает: http://www.sql.ru/forum/1179250/ora-4068-with-compile-time-constant
Оказывается и в 12.1.0.2 не исправили.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39410656
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ask,

На мой взгляд, для 12c есть объяснение
http://docs.oracle.com/database/122/LNPLS/plsql-packages.htm#GUID-001EF960-7491-411B-A5F3-D1260A45794B SERIALLY_REUSABLE Packages


SERIALLY_REUSABLE packages let you design applications that manage memory better for scalability.

If a package is not SERIALLY_REUSABLE, its package state is stored in the user global area (UGA) for each user. Therefore, the amount of UGA memory needed increases linearly with the number of users, limiting scalability. The package state can persist for the life of a session, locking UGA memory until the session ends. In some applications, such as Oracle Office, a typical session lasts several days.

If a package is SERIALLY_REUSABLE, its package state is stored in a work area in a small pool in the system global area (SGA). The package state persists only for the life of a server call. After the server call, the work area returns to the pool. If a subsequent server call references the package, then Oracle Database reuses an instantiation from the pool. Reusing an instantiation re-initializes it; therefore, changes made to the package state in previous server calls are invisible. (For information about initialization, see "Package Instantiation and Initialization".)


Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
create or replace package pkg
is
PRAGMA SERIALLY_REUSABLE;

  procedure p;
end;
/


create or replace package body pkg
is
PRAGMA SERIALLY_REUSABLE;
  --глобальная константа
  g_c constant varchar2(1) := 'A';

  procedure p
  is
  -- либо в процедуре можно объявить константу
  -- тоже будет работать - уже без прагмы
  -- c constant varchar2(1) := 'В';
  begin
   dbms_output.put_line(pkg.g_c);   
  end;
end;
/

SESSION2> exec pkg.p
A

PL/SQL procedure successfully completed.

SESSION1> alter package pkg compile body;

Package body altered.

SESSION2> exec pkg.p
A

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39410668
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dba123На мой взгляд, для 12c есть объяснениеНет, ты просто чего-то не понял.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39410765
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GogolElic,

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

И вообще как при изменении пакета, сделать так, что бы пользователю не валилась ошибка о недоступности функции пакета.

Move all constants and variables into a stand-alone package spec and reference those from your initial package. Thus when the status of your original package is invlidated for whatever reason, it has no package state and can be recompiled automatically, however the package containing the vars/const will not become invalidated as it has no dependencies, so the state that is in memory for that package will remain and can continue to be used.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39410841
Ask
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ask
Гость
dba123Ask,
На мой взгляд, для 12c есть объяснение
[/src]
Ну это не объяснение, а еще один вариант как сделать пакет с константами stateless. К сожалению у SERIALLY_REUSABLE есть свои минусы - такие пакеты нельзя дергать из триггеров и sql.
...
Рейтинг: 0 / 0
Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
    #39414511
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!
Константы вынес в отдельный пакет.
Пользователь ошибку ORA-04068: existing state of packages has been discarded ловить перестал.
Константы добавляются очень редко, а обновления рабочего пакета происходит постоянно.
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Автоматическая перекомпиляция при обращении к пакету. Ткните носом в доку.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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