You still need to pass all 3 params to match the function signature even though the last one's value will be completely ignored, only its type being important. From the CALL doc:
Arguments must be supplied for all procedure parameters that lack defaults, including OUT parameters. However, arguments matching OUT parameters are not evaluated, so it's customary to just write NULL for them. (Writing something else for an OUT parameter might cause compatibility problems with future PostgreSQL versions.)
demot at db<>fiddle
create procedure p(in a1 text,in a2 text,out a3 text)language plpgsql as $p$
begin
a3:='hello';
end $p$;
call p('a1_v','a2_v');--will not work
ERROR: procedure p(unknown, unknown) does not exist
LINE 1: call p('a1_v','a2_v');--will not work
^
HINT: No procedure matches the given name and argument types. You might need to add explicit type casts.
As soon as you pass anything as the 3rd param, the procedure will be recognised just fine, as long as the type matches:
call p('a1_v','a2_v',null::text);--ok
As per the quote earlier, if you want to do calls that skip the 3rd param, you need to switch it from just out to inout and add a default - then a 2-param call will be accepted:
drop procedure p(text,text,text);
create procedure p(in a1 text,in a2 text,inout a3 text default null)
language plpgsql as $p$
begin
a3:='hello';
end $p$;
call p('a1_v','a2_v');--now the default handles the skipped param
call p('a1_v','a2_v','');--still works
call p('a1_v','a2_v','a3_v');--still works
outtoinoutand attach adefault- then a 2-param call will be accepted: demo.