By default, PL/SQL passes OUT (and IN OUT) parameters "by value": the subprogram works on a local copy, and the value is copied back to the actual argument only if the subprogram completes normally without an unhandled exception. IN parameters, by contrast, are passed by reference (read-only). "By reference" for OUT parameters only happens if you explicitly add the NOCOPY compiler hint, which is an optimization, not the default. "By type" isn't a real PL/SQL parameter-passing mode.