TYPE и память...

ORA_Worker
Дата: 06.12.2007 12:14:17
Всем привет... Вот такая неприятная ситуация, подскажите, пож-та, что можно сделать...

Создаю типы:
create or replace type OBJ as object(
indx number
)

create or replace type TBL_OBJ as table of OBJ

Затем в PLSQL-процедуре создаю переменную, инициализирую ее, начинаю работать с массивом:

declare
rec TBL_OBJ := TBL_OBJ();
begin
rec.extend;
rec(1) := OBJ (...);
и т.д.
end;

При первом вызове процедуры - работает все хорошо, при повторном все ломается в силу того, что в памяти сидят данные, полученные при первом проходе... Если сбросить сессию и подключиться заново, то, очевидно, все работает...

1. Попытался очистить массив с помощью метода delete - все равно не работает...
2. Попытался объявить массив в блоке PLSQL-процедуры - нельзя использовать операторы TABLE, CAST, MULTISET...
3. Можно, конечно, чистить shared_pool - но это скажется на производительности...
???

Подскажите что-нибудь...
Elic
Дата: 06.12.2007 12:18:57
ORA_Worker
все ломается
Подскажите что-нибудь...
RTFM
ORA_Worker
Дата: 06.12.2007 12:21:49
Elic
ORA_Worker
все ломается
Подскажите что-нибудь...
RTFM


Собственно, главное не то, что что-то ломается (можно про это забыть), а то, как почистить массив после первого прохода, чтоб перед вторым он был пустой???
Змей Равниныч
Дата: 06.12.2007 12:24:27
Jannny
Дата: 06.12.2007 12:27:30
ORA_Worker
Собственно, главное не то, что что-то ломается (можно про это забыть), а то, как почистить массив после первого прохода, чтоб перед вторым он был пустой???
Собственно, так как пытались. Но Ваша проблема где-то в логике действий. Если у Вас массив объявлен локально, то там ничего не должно сидеть. Если глоабльно, то delete поможет, а раз не помогает, то ошибка в другом.
ORA_Worker
Дата: 06.12.2007 12:32:34
Jannny
ORA_Worker
Собственно, главное не то, что что-то ломается (можно про это забыть), а то, как почистить массив после первого прохода, чтоб перед вторым он был пустой???
Собственно, так как пытались. Но Ваша проблема где-то в логике действий. Если у Вас массив объявлен локально, то там ничего не должно сидеть. Если глоабльно, то delete поможет, а раз не помогает, то ошибка в другом.


Массив объявлен глобально (ссылается на тип в схеме), delete не работает... При "втором" проходе, даже отладчик в нем (в массиве) видит данные...
ORA_Worker
Дата: 06.12.2007 12:34:00
Змей Равниныч
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_sessi2.htm#1000558


Спасибо за ссылку, но все равно что-то не работает... Сделал все, как сказано, но может проблема в том, что типы глобальные?..
Jannny
Дата: 06.12.2007 12:37:34
ORA_Worker
Массив объявлен глобально (ссылается на тип в схеме)
Бог с типом. Сам массив где объявлен?

ORA_Worker
delete не работает...
та ссылка, куда Elic послал :)

Ещё раз - Вы просто где-то делаете неправильные выводы. Попробуйте пойти с самого начала :) Опять же - там ли чистите, где нужно?

ORA_Worker
даже отладчик в нем (в массиве)
Отладчики бывают разные :)
ORA_Worker
Дата: 06.12.2007 13:06:34
Всем спасибо за советы... Oracle, оказывается за собой тащит значения глобальных переменных, инициализация их в теле, а не в объявлении процедуры - решило проблемы...