Thread: Quick Pg/PLSQL question
Hey everyone, Trying to run a VERY simple function. I've read through the Programmer's Manual over and over, and continue to receive errors. First, I ran the following to add the language to the database: createlang plpgsql test I then load the function using: \i test_func.sql I then run the function by simply executing: select test_func() as answer; The function I'm trying to execute is: ------------------------------------------ CREATE OR REPLACE FUNCTION test_func() RETURNS INTEGER AS ' DECLARE BEGIN INSERT INTO transaction_summary VALUES (61, 1, "now", 0, 0, 0, 0); RETURN 1; END; ' LANGUAGE 'plpgsql'; ------------------------------------------ Very simple function, but I continue to receive errors, because of the "now" part. However, in the Programmer's Manual, it specifically uses "now" with double quotes in a couple examples. When executing the function, I continue receiving the following errors: NOTICE: Error occurred while executing PL/pgSQL function test_func NOTICE: line 4 at SQL statement ERROR: Attribute 'now' not found Any help would be greatly appreciated. Thank you, Matt Wagner Envex Developments Your CGI Script Specialists http://www.envex.net/
On Fri, Sep 27, 2002 at 10:28:57PM -0500, Matt Wagner wrote: > INSERT INTO transaction_summary VALUES (61, 1, "now", 0, 0, 0, 0); > Very simple function, but I continue to receive errors, because of the "now" > part. However, in the Programmer's Manual, it specifically uses "now" with > double quotes in a couple examples. When executing the function, I continue > receiving the following errors: Simple error. The manual uses two quote's, not double quotes (ie, '' vs ") which probably look the same in many fonts. Two quotes counts as an escaped quote whereas a double quote make postgresql think it's an identifier, which doesn't work. Hope tihs helps, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > There are 10 kinds of people in the world, those that can do binary > arithmetic and those that can't.
"Matt Wagner" <mwagner@envex.net> writes: > CREATE OR REPLACE FUNCTION test_func() RETURNS INTEGER AS ' > DECLARE > BEGIN > INSERT INTO transaction_summary VALUES (61, 1, "now", 0, 0, 0, 0); > RETURN 1; > END; > ' LANGUAGE 'plpgsql'; > NOTICE: Error occurred while executing PL/pgSQL function test_func > NOTICE: line 4 at SQL statement > ERROR: Attribute 'now' not found You would get the same error if you did that INSERT by hand, because double-quoted "now" is completely different from single-quoted 'now' in SQL --- one is an identifier equivalent to no-quotes-at-all now, the other is a literal constant. What you want here is a literal constant that can be fed to the timestamp input routine. You probably tried single-quoted 'now' already and got syntax errors that you didn't understand. The trick here is that the function body is itself a single-quoted string literal. To get single quotes into the body of the function, you must either double 'em or backslash 'em. So either of these should work: INSERT INTO transaction_summary VALUES (61, 1, ''now'', 0, 0, 0, 0); INSERT INTO transaction_summary VALUES (61, 1, \'now\', 0, 0, 0, 0); This is covered in the manual, but perhaps it's not obvious till you get bit by it... regards, tom lane