There are a lot of reasons stored procedures are good or bad. I use them sparingly. However, I worked for a company that had a policy to communicate with the database through procedures exclusively. The main reason was security: When you only have execute rights on procedures, you can never have access to the underlying tables. As an example, you may have the right to a CheckLogin routine, but not to the Accounts table. Off course, all direct table rights should be denied in such a case.
I use procedures mainly in my (repeatable) re-create scripts, because I sometimes have to check if something exists before either creating or dropping it.
Occasionally, I use them for difficult queries or difficult updates as well.
However, procedures get "behind the back" of the programs. But then, all database connections do. That's what multi-user programming is all about.
That said, I am more afraid of triggers than of procedures. Triggers are some "black magic" that can run without anyone realising it, but procedures just have to be called. So you can find procedure calls in the query log, for instance.
+++ Despite being wrong in every important aspect, that is a very good analogy +++
Hex (in Darwin's Watch)