>> The main difference is that, by default, parameters are passed to procedures by reference but are passed to functions by value. You can override this behavior, see UDFPARMS for more info. Both can return a value.
You can also override the default aprameter passing without using UDFPARMS by using ()'s to force pass by value and @ to force pass by reference.
MyFunc(@Parm1,Parm2)
DO MYFunc WITH (parm1), Parm2