Если вы хотите сделать параметр необязательным, то вы должны указать значение по умолчанию.Я был бы удивлен, если значение по умолчанию работает должным образом, если его нет в объявлении тела.
Я вошел в привычку делать все мои спецификации спецификации пакета точными копиями объявлений тела пакета, чтобы избежать проблем.
РЕДАКТИРОВАТЬ:
Как указывает OP, он может быть только в спецификации, и он работает.Если это в теле, но не в спецификации, возникает ошибка:
SQL> CREATE OR REPLACE PACKAGE p AS
2 PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2);
3 END;
4 /
Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
2 PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1', p2 VARCHAR2)
3 IS
4 BEGIN
5 dbms_output.put_line(p1||','||p2);
6 END;
7 END;
8 /
Warning: Package body created with compilation errors
SQL>
Но если только в спецификации, все работает:
SQL> CREATE OR REPLACE PACKAGE p AS
2 PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1Dflt', p2 VARCHAR2);
3 END;
4 /
Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
2 PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2)
3 IS
4 BEGIN
5 dbms_output.put_line(p1||','||p2);
6 END;
7 END;
8 /
Package body created
SQL> DECLARE
2 BEGIN
3 p.prc(p2=>'Test');
4 END;
5 /
P1Dflt,Test
PL/SQL procedure successfully completed
SQL>
Тем не менее, ответ на вопросЧто касается его разницы, то, похоже, нет никакой разницы между установкой значения по умолчанию только в спецификации или в обоих местах - конечный результат одинаков.Я хотел бы повторить мое убеждение, что вы должны поместить его в обоих местах для документальных целей.