When I first started writ­ing Oracle PL/SQL, I tried to de­fine func­tion and pro­ce­dure pa­ra­me­ters in the same way I de­fined SQL table columns:

PROCEDURE MyFunction
(
  Param1 NUMBER(2),
  Param2 VARCHAR2(32)
);

Of course, you get a com­pile-time er­ror if you try to spec­ify pre­ci­sion for pa­ra­me­ters. Instead you have to do:

PROCEDURE MyFunction
(
  Param1 NUMBER,
  Param2 VARCHAR2
);

Ah, but you can also de­fine pa­ra­me­ter types in terms of ta­bles:

PROCEDURE MyFunction
(
  Param1 myschema.mytable.column1%TYPE,
  Param2 myschema.mytable.column2%TYPE
);

And I as­sumed this en­forced the pre­ci­sion of the table’s columns, if it had any.

Never as­sume.

The pa­ra­me­ters will not en­force the pre­ci­sion of the columns they are based on.

Why does­n’t Oracle al­low you to spec­ify pre­ci­sion for your pa­ra­me­ters? I as­sume (ha ha) that there’s an ac­tual rea­son, but I don’t know enough to guess what that rea­son might be.