В случае возникновения ошибки в подпрограмме устанавливается исключительная ситуация, которая может быть описана предварительно или определена пользователем. Если в процедуре отсутствует обработчик данной исключительной ситуации, управление программой сразу же передается из процедуры в вызывающую среду в соответствии с правилами, установленными для передачи исключительных ситуаций (см. главу 7). Однако в этом случае значения формальных параметров OUT и IN OUT не возвращаются фактическим параметрам. Фактические параметры будут иметь те же значения, которые они имели бы, если бы процедура не вызывалась. Предположим, что создается следующая процедура:
Перед первым вызовом RaiseError в переменной содержалось значение 1. Первый вызов был успешен, и v_TempVar было присвоено значение 7. Перед вторым вызовом RaiseError значение v_TempVar изменилось на 2. Второй вызов завершился неуспешно, и переменная v_TempVar осталась равной 2 (а не изменилась на 7).
Внимание
1 Семантика обработки исключительной ситуации изменяется, если параметр OUT ил и IN OUT объявляется с помощью NOCOPY( см. ниже раздел "Семантика исключительной ситуации при использовании NOCOPY").
Передача параметров по ссылке и по значению
Параметры подпрограмм передаются одним из двух способов: по ссылке или по значению. Когда параметр передается по ссылке (by reference), соответствующему формальному параметру передается указатель на фактический. Если же параметр передается по значению (by value), оно копируется из фактического параметра в формальный. Передача по ссылке обычно осуществляется быстрее, так как при этом опускается операция копирования; особенно это касается параметров сборных конструкций (таблиц и изменяемых массивов; см. главу 8). По умолчанию в PL/SQL параметры IN передаются по ссылке, а параметры IN OUT и OUT — по значению. Это сделано для того, чтобы сохранить семантику исключительных ситуаций (см. предыдущий раздел) и чтобы иметь возможность проверять ограничения, наложенные на фактические параметры. До Огас1е8г изменить этот режим было нельзя.
< Предыдущая | Следующая > |
---|