Your varchar2 variables have to be sized, I'm guessing the correct sizes here...
IN parameters are passed by reference (so behind the scenes it's a pointer to the value), so don't need a size - hence why p_ean13_without_checkdigit doesn't need to be sized. Variables are instances, so the PL/SQL engine needs to know how much memory to set aside. Hence why variables with a size element (char, varchar2 etc.) have to be size.
function ean13_with_checkdigit(p_ean13_without_checkdigit in varchar2) return varchar2 as
checksum_digit varchar2(1);
ean13 varchar2(13);
l_sum number;
l_multiple number;
begin
for i in 1 .. 12
loop
if MOD(i, 2) = 0 then
l_multiple := 3;
else
l_multiple := 1;
end if;
l_sum := NVL(l_sum, 0) + SUBSTR(p_ean13_without_checkdigit, i, 1) * l_multiple;
end loop;
checksum_digit := TO_CHAR(10 - MOD(l_sum, 10), 'FM0');
ean13 := p_ean13_without_checkdigit || checksum_digit;
return ean13;
end;