A procedure is a subprogram that does not return a value (though there are ways to retrieve data through parameters, explained in detail later). It is generally called directly or by another PL/SQL subprogram.
A function is a PL/SQL object that does return a value directly. They can be called within SQL statements.
A trigger is a subprogram that is distinguished by the fact that it is fired when a given event occurs in the database (for example when an INSERT statement is executed on a specific table).
A package is a PL/SQL structure that is used to group related subprograms together.