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

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

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

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

2 ответа

Решение

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

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

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

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

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. Смотрите, в частности, параметры подпрограммы.

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

Другие вопросы по тегам