CftClub.ru
Клуб специалистов ЦФТ-Банк

переменная в «локальные описание». не обнуляется

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 больше не знаю.

Больше и не надо Smile

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 пишет:

Как вариант - объявлять не в локальных описаниях, а прямо там, где нужна (Секция "Тело" или секция "Проверка").

Операция по сути представляет собой пакет, где локальные описания - это переменные пакета.
А секции "Тело" и "Проверка" - это процедуры внутри пакета.


Спасибо, после этого объяснения все стало понятно....
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru