Почему для переменной oracle plsql varchar2 нужен размер, а для параметра нет?

Предположим, у вас есть эта процедура:

PROCEDURE f (param VARCHAR2)
IS 
   var VARCHAR2(10);
BEGIN
   var := 'hi';
END f;

Я хотел бы понять, почему var нужно указывать длину, а param нет. Мне трудно найти информацию об этом в документах оракула.


person grinch    schedule 26.02.2014    source источник


Ответы (2)


«База данных Oracle получает длину, точность и масштаб аргумента из среды, из которой вызывается процедура».

Пожалуйста, ознакомьтесь с этим вопросом, связанным с .

Ссылка: Oracle® Database SQL Reference 10g Release 2 (10.2) Пожалуйста, смотрите раздел семантика/аргумент/тип данных.

person Joseph B    schedule 26.02.2014

Разница в том, что заголовки подпрограмм имеют формальные параметры, которые заменяются факическими параметрами при вызове подпрограммы:

create or replace function f(
  p_x in varchar2 /* a formal parameter */
 ,p_y in varchar2 /* a formal parameter */
) return varchar2 /* a formal parameter */
is
begin
  return p_x || p_y;
end;

declare
  v_z varchar2(10);
  v_x constant varchar2(1) := 'X';
begin
  v_z := f(v_x, 'Y'); /* actual parameters */
end;

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

Типы данных формальных и фактических параметров не должны быть одинаковыми, но совместимыми.

Есть много других подробностей, но их можно прочитать в главе PL. Подпрограммы /SQL из Справочник по языку PL/SQL. См., в частности, раздел Параметры подпрограммы.

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

person user272735    schedule 27.02.2014