2015-03-13 2 views
0

Есть ли способ уничтожить объект PL/SQL, скажем, запись?Уничтожить объект Oracle PLSQL

В визуальном паскале мы можем использовать FreeAndNil (объект), и эта процедура освобождает память, используемую объектом, и указывает ее на Nil (null), тем самым уничтожая объект.

Мне было интересно, есть ли способ сделать это на объекте/записи PLSQL, или если я должен присвоить ему нуль.

+7

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

+0

Да. Мы создали несколько пакетов, которые реализуют бизнес-правила. Эти пакеты выполняют вычисления и передают записи в качестве параметров. Во время отладки мы столкнулись с ситуацией, когда на первом проходе никакое значение не возвращалось. Затем, на втором проходе, мы получили нормальное возвращение. Изучая проблему, мы выяснили, что запись заполнена данными другого метода в клиентском приложении, которые использовали один и тот же пакет. Вот почему я прошу о том, чтобы безопасно очистить запись, чтобы мы не получали смешанные данные. Такое поведение было неожиданным. –

+3

Это * очень * другой вопрос от того, о котором вы просите. Невозможно, чтобы объект PL/SQL, созданный за один сеанс, был видимым в другом сеансе. Если вы создали трехуровневое приложение, в котором средний уровень поддерживает пул соединений, и у вас есть встроенные пакеты, которые поддерживают состояние, вы хотите очистить состояние пакета как часть закрытия логического соединения и возврата его в пул. Если ваши пакеты не соответствуют действительности, я бы сказал, что у вашего кода есть ошибка. –

ответ

2

Вы можете установить тип строки в null, никаких проблем.

Это нормально компилируется:

declare 
    r dual%rowtype; 
begin 
    r := null; 
end; 

Если через переменные теряет объем (так после end; здесь), Oracle будет автоматически уничтожить его, поэтому нет необходимости устанавливать его null, или освободить его каким-либо образом ,

+2

Я не думаю, что это отвечает на вопрос OP (который, насколько я понимаю), сводится к тому, нужно ли вам или нужно установить его в NULL). –

+0

@FrankSchmitt: Я получил ваше мнение. Теперь лучше? Добавлено окончательное объяснение. –

+0

Darn. Это делает мой ответ устаревшим - удаляя его :-) –

0

Проблема заключалась в том, что пакет имел глобальную переменную (переменную, объявленную в спецификации пакета).

Клиентское приложение запустило транзакцию, которая выполнила функцию из этого пакета; эта функция изменила значение глобальной переменной. Затем была вызвана другая функция, зависящая от значения переменной. Это привело к проблеме.

Вывод очевиден: не используйте глобальные переменные.

Есть, конечно, другие решения, такие как закрытие транзакции (таким образом, уничтожение переменной, как объяснил Патрик Хофман).

Как я уже сказал, это устаревшее программное обеспечение ... Я реорганизовал код, и эта проблема (наряду с несколькими другими) исчезла. Спасибо за помощь!