DeepEdit!

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

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Ограничения на формальные параметры

При вызове процедуры ей передаются значения фактических парамет­ров, и внутри процедуры к этим значениям обращаются при помощи формальных параметров. При этом передаются не только значения, но и ограничения, наложенные на переменные, как часть механизма передачи параметров. При описании процедуры запрещается ограничивать длину параметров типа 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.

 









jAntivirus