postgresql's pl/sql functions are pretty good at emulating most of the oracle functionality, but they do have a couple of serious limitations:
1. max number of args is 16. This used to be only 8 for pg versions before 7.0. A lot of the pl/sql functions in acs 4.0 have a large number of input arguements, but so far the largest number of input args that I have encountered is 16.
2. if any of the args are null, the function short-circuits and returns a null.
3. an pl/sql function is an implicit transaction. no transaction control is allowed inside of a pl/sql function. Either the whole function completes correctly, and is committed, or the whole thing is rolled back.
4. pg doesn't support packages, so we'll need a naming convention to avoid namespace conflicts. Also pg truncates names greater than a certain length, so it might be difficult to do something simple like substitute a '_' for a '.' when porting the package specific function calls.