Эффективное программирование на PL/SQL - Именованные параметры функции

ОГЛАВЛЕНИЕ

Именованные параметры функции

Рассмотрим простую функцию:

create or replace function myfunc
(
        p_param1        number,
        p_param2        number
)
return number
is
begin
        return p_param1 + p_param2;
end;
/

Эта функция делает очень простую операцию, но она хорошо демонстрирует концепцию. Так как в этой функции два параметра, то её можно вызвать, передав параметры, как позиционные значения, а именно:

myfunc (1,2)

Или как именованные параметры:

myfunc ( p_param1 => 1, p_param2 => 2)

Однако, в конце концов возникает проблема, если использовать её в select-предложениях. Если в Oracle Database 10 g выполнить следующее предложение:

SQL> select myfunc (p_param1=>1,p_param2=>1) from dual;

возникнет ошибка:

select myfunc (p_param1=>1,p_param2=>1) from dual
 *
ERROR at line 1:
ORA-00907: missing right parenthesis

В Oracle Database 11 g вы вправе использовать нотацию:

SQL> select myfunc (p_param1=>1,p_param2=>1) from dual;

MYFUNC(P_PARAM1=>1,P_PARAM2=>1)
-------------------------------
 2

1 row selected.

...которая работает правильно. Можно указывать именованную нотацию в конце, а первые параметры должны быть позиционными. Например, следующий вызов, где параметр p_param1 равен 1, будет корректным:

select myfunc (1,p_param2=>2) from dual

А этот нет (позиционный параметр в конце):

SQL> select myfunc (p_param1=>1,2) from dual;

select myfunc (p_param1=>1,2) from dual
 *
ERROR at line 1:
ORA-06553: PLS-312: a positional parameter association may not follow a named association