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