При вызове процедуры ей передаются значения фактических параметров, и внутри процедуры к этим значениям обращаются при помощи формальных параметров. При этом передаются не только значения, но и ограничения, наложенные на переменные, как часть механизма передачи параметров. При описании процедуры запрещается ограничивать длину параметров типа CHAR и VARCHAR2, а также точность и/или масштаб параметров типа NUMBER, поскольку ограничения принимаются от фактических параметров. К примеру, следующее описание процедуры неверно и приводит к выдаче ошибки компиляции:
то параметр rl будет иметь максимальную длину 40 (задается фактическим параметром vVariablel), а для параметра p_Parameter2 будут установлены точность 7 и масштаб 3 (задаются фактическим параметром v_Variable2). Рассмотрим еще один блок, в котором вызывается ParameterLength:
Единственным отличием между этим блоком и предыдущим является то, что длина v_Variable1 и, следовательно, p_Parameter1 равна 10, а не 40. В процедуре ParameterLength параметру p_Parameter1 (и v_Variablel) присваивается строка, состоящая из 15 символов, поэтому пространства для нее недостаточно. В результате при вызове данной процедуры Oracle выдает следующую ошибку:
Причина ошибки заключается не в процедуре, а в программе, вызывающей эту процедуру. К тому же ORA-6502 — это ошибка этапа выполнения, а не компиляции. Таким образом, блок скомпилирован успешно, а ошибка на самом деле возникла тогда, когда процедура возвратила значение, и система поддержки PL/SQL попыталась скопировать фактическое значение ' abccfefghij klmno' в формальный параметр.
Совет
Во избежание ошибок, подобных ORA-6502, при создании процедур документируйте все ограничения, налагаемые на фактические параметры, вносите в сохраняемые процедуры комментарии, а также записывайте, какие функции выполняет сама процедура. В качестве альтернативы для объявления формальных параметров можно использовать %TYPE.
% TYPE и параметры процедур Единственным способом наложения ограничений на формальные параметры является использование атрибута %TYPE. Если формальный параметр объявлен при помощи %TYPE, а базовый тип ограничен, то это ограничение распространяется не на фактический параметр, а на формальный. Объявим ParameterLength следующим образом:
p_Parameter2 будет ограничен точностью 3, поскольку эта точность задана для столбца current_credits. Даже если вызвать ParameterLength с фактическим параметром большей точности, будет использована точность формального параметра. Ниже приводится пример, в результате выполнения которого возвращается ошибка ORA-6502:
Внимание
Сообщение об ошибке ORA-6502 было изменено в Oracle3. До Oracle3 при ее возникновении сообщалось "ORA-6502: PL/SQL numeric or value error" независимо от реальной причины ошибки. Например, текст сообщения об ошибке различен в двух предыдущих примерах, что отражает поведение Oracle8i.
< Предыдущая | Следующая > |
---|