Hey everyone, I am writing a plpgsql function that (to greatly simplify) raises an exception with a formatted* message. Ideally, I should be able to call it with raise_exception('The person %I has only %I bananas.', 'Fred', 8), which mimics the format(text, any[]) calling convention.
Here is where I have encountered a limitation of PostgreSQL's design: https://www.postgresql.org/docs/11/datatype-pseudo.html mentions explicitly that, "At present most procedural languages forbid use of a pseudo-type as an argument type". My reasoning is that I should be able to accept a value of some type if all I do is passing it to a function that accepts exactly that type, such as format(text, any[]). Given the technical reality, I assume that I wouldn't be able to do anything else with that value, but that is fine, since I don't have to do anything with it regardless. BR MichaĆ "phoe" Herda *I do not want to use the obvious solution of raise_exception(format(...)) because the argument to that function is the error ID that is then looked up in a table from which the error message and sqlstate are retrieved. My full code is in the attached SQL file. Once it is executed: SELECT gateway_error('user_does_not_exist', '2'); -- works but is unnatural, SELECT gateway_error('user_does_not_exist', 2); -- is natural but doesn't work.
install-errors.sql
Description: application/sql