переменная в «локальные описание». не обнуляется
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
e.kha Участник со стажем
Вступление в Клуб: 26.04.2012
|
Чт Апр 26, 2012 10:29  переменная в «локальные описание». не обнуляется |
|
Полезность: Нет оценки
|
Уважаемый ALL, не могу понять проблему. Как мне объяснили переменные объявленные "локальные описание" живут на время выполнения операции. в локальных объявлен массив
type RefAC_FIN_Type is table of ref [AC_FIN];
RefAc_Fin RefAC_FIN_Type;
и процедура заполнения
procedure FindAccounts(rdate in date, refAc in out RefAC_FIN_Type) is
ref_cl integer := 0;
begin
select acc(acc : id)
in [AC_FIN] all
where acc.[MAIN_USV].[NUM] in ('30102', '30110', '30213', '30221', '30602', '30233') and
acc.[DATE_OP] < rdate and
acc.[CLIENT_R]%class = 'CL_BANK_N' and
acc.[CLIENT_R] != [SYSTEM].[VARIABLES].OurBank and
(
acc.[DATE_CLOSE] is null or
acc.[DATE_CLOSE] > rdate
)
order by acc.[CLIENT_R], acc.[FINTOOL]
into refAc;
end;
Проблема - после завершения операции RefAc_Fin не обнуляется и при повторном вызове операции в этой же сессии вызывается уже заполненным. Что я не так дела? |
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Чт Апр 26, 2012 10:39   |
|
Полезность: 1
|
Цитата: | Состояние переменной, константы или курсора,
объявленных в спецификации или теле пакета (т.е.
не внутри процедуры), сохраняется на время
сессии пользователя (т.е. даже между
транзакциями), и теряется, когда текущая сессия
заканчивается, или при перекомпиляции пакета. |
Переменные, объявленные в локальных описаниях, попадают в тело пакета. Следовательно
очищайте переменную перед стартом операции вашей |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Чт Апр 26, 2012 10:49  Re: переменная в «локальные описание». не обнуляет |
|
Полезность: 1
|
e.kha пишет: | Уважаемый ALL, не могу понять проблему. Как мне объяснили переменные объявленные "локальные описание" живут на время выполнения операции. в локальных объявлен массив |
Глобальные переменные видны отовсюду. Переменные из локального описания видны только в пределах пакета. Если операция запускается повторно, то локальные переменные при этом сохранены с предыдущего запуска. |
|
 |
e.kha Участник со стажем
Вступление в Клуб: 26.04.2012
|
Чт Апр 26, 2012 10:50   |
|
Полезность: Нет оценки
|
1. но как мне объяснили переменная в глобальном описании живет на время сессии. переменная в локальном описании живет на время операции. Это не так?
2. В локальных описаниях было описана переменная
CurY integer :=4;
После выполнения операции она принимает значение например 64.
При повторном вызове операции она уже равна 64, когда в есть явная инициализация по дефолту. Как данный случай чистить?! |
|
 |
e.kha Участник со стажем
Вступление в Клуб: 26.04.2012
|
Чт Апр 26, 2012 10:58   |
|
Полезность: Нет оценки
|
1. как правильно очистить массив? кроме как RefAc_Fin.delete больше не знаю.
2. если в типе массив А описан вложенный массив В из структуры С с дефолтными значениями, достаточно очистить массив А и не очищать массив В? |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Чт Апр 26, 2012 11:01   |
|
Полезность: 1
|
e.kha пишет: | 1. но как мне объяснили переменная в глобальном описании живет на время сессии. переменная в локальном описании живет на время операции. Это не так?
|
Нет, не так. Живет она всегда, но только в пределах операции. При повторном вызове никуда не денется.
e.kha пишет: |
2. В локальных описаниях было описана переменная
CurY integer :=4;
После выполнения операции она принимает значение например 64.
При повторном вызове операции она уже равна 64, когда в есть явная инициализация по дефолту. Как данный случай чистить?!
|
Если ее нужно каждый раз чистить, значит ее нужно каждый раз чистить.
Как вариант - объявлять не в локальных описаниях, а прямо там, где нужна (Секция "Тело" или секция "Проверка").
Операция по сути представляет собой пакет, где локальные описания - это переменные пакета.
А секции "Тело" и "Проверка" - это процедуры внутри пакета.
Последний раз редактировалось: devor (Чт Апр 26, 2012 11:04), всего редактировалось 1 раз |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Чт Апр 26, 2012 11:03   |
|
Полезность: Нет оценки
|
e.kha пишет: | 1. как правильно очистить массив? кроме как RefAc_Fin.delete больше не знаю.
|
Больше и не надо
e.kha пишет: |
2. если в типе массив А описан вложенный массив В из структуры С с дефолтными значениями, достаточно очистить массив А и не очищать массив В? |
Да. |
|
 |
maestro Профи
Вступление в Клуб: 12.10.2010
|
Чт Апр 26, 2012 11:07   |
|
Полезность: Нет оценки
|
e.kha пишет: | 1. как правильно очистить массив? кроме как RefAc_Fin.delete больше не знаю. |
Вначале подумайте так ли необходимо делать этот массив глобальным? Глобальные переменные - моветон во всех языках программирования. Возможно его лучше объявить внутри пакетной процедуры, и он будет инициализироваться автоматически.
Если от пакетной переменной никуда не деться, то RefAc_Fin.delete
e.kha пишет: | 2. если в типе массив А описан вложенный массив В из структуры С с дефолтными значениями, достаточно очистить массив А и не очищать массив В? |
Достаточно. Но задумайтесь над тем, не совершаете ли вы ошибку, проектируя такую навороченную структуру? |
|
 |
e.kha Участник со стажем
Вступление в Клуб: 26.04.2012
|
Пт Апр 27, 2012 07:11   |
|
Полезность: Нет оценки
|
devor пишет: |
Как вариант - объявлять не в локальных описаниях, а прямо там, где нужна (Секция "Тело" или секция "Проверка").
Операция по сути представляет собой пакет, где локальные описания - это переменные пакета.
А секции "Тело" и "Проверка" - это процедуры внутри пакета. |
Спасибо, после этого объяснения все стало понятно.... |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|