Обсуждение: Correctly quoting inside plpgsql functions
Hi all.
I'm trying to create a function which should return a cursor (to be used
from a jdbc connection) and I'm experiencing problems in quoting (I believe)
correctly inside the function:
<code>
jsg_2=# CREATE FUNCTION myfun(char(2)) RETURNS refcursor AS
jsg_2-# ' DECLARE
jsg_2'# l_lang alias for $1;
jsg_2'# l_cursor refcursor;
jsg_2'# BEGIN
jsg_2'# OPEN l_cursor FOR EXECUTE
jsg_2'# ''SELECT * FROM t INNER JOIN i18n ON t.id=i18n.id AND
i18n.language_id='' || quote_ident(l_lang) || '' ORDER BY description'';
jsg_2'# RETURN l_cursor;
jsg_2'# END;
jsg_2'# ' LANGUAGE 'plpgsql';
CREATE
jsg_2=# select myfun('en',0);
NOTICE: Error occurred while executing PL/pgSQL function myfun
NOTICE: line 5 at open
ERROR: Attribute 'en' not found
</code>
The Function intially gets parsed, but when called with the parameter, it
seems that no quotes are around the first variable.
What am I missing?
alberto.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Try quote_literal instead. Joshua b. Jore http://www.greentechnologist.org On Sat, 20 Apr 2002, alberto bolchini wrote: > jsg_2'# ''SELECT * FROM t INNER JOIN i18n ON t.id=i18n.id AND > i18n.language_id='' || quote_ident(l_lang) || '' ORDER BY description''; > jsg_2=# select myfun('en',0); > NOTICE: Error occurred while executing PL/pgSQL function myfun > NOTICE: line 5 at open > ERROR: Attribute 'en' not found -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (OpenBSD) Comment: For info see http://www.gnupg.org iD8DBQE8wXBBfexLsowstzcRArkjAKDJHOgbVyGUz9YYXwX6VJoR23k8YACfVxeO lJ74TlFfnPByZ+Bhfhi9mUw= =1Y0e -----END PGP SIGNATURE-----
Yup! thanks a lot Joshua, it works. I've tried a few combinations of a number of qoutes, with an without the quote_ident/quote_literal before writing to the list, but actually the problem was that when I was correctly quoting, I misunderstood the error I got upon FETCHing the rows: ERROR: parser: parse error at or near "'" it was not due to the incorrect quoting but to the incorrect FETCH I was issueing: jsg_2=# FETCH ALL IN "<unnamed cursor 1>"; instead of jsg_2=# FETCH ALL IN "<unnamed cursor 1>"; Thanx. a. Joshua b. Jore wrote: >-----BEGIN PGP SIGNED MESSAGE----- >Hash: SHA1 > >Try quote_literal instead. > >Joshua b. Jore >http://www.greentechnologist.org > >On Sat, 20 Apr 2002, alberto bolchini wrote: > > >>jsg_2'# ''SELECT * FROM t INNER JOIN i18n ON t.id=i18n.id AND >>i18n.language_id='' || quote_ident(l_lang) || '' ORDER BY description''; >> > >>jsg_2=# select myfun('en',0); >>NOTICE: Error occurred while executing PL/pgSQL function myfun >>NOTICE: line 5 at open >>ERROR: Attribute 'en' not found >> >-----BEGIN PGP SIGNATURE----- >Version: GnuPG v1.0.6 (OpenBSD) >Comment: For info see http://www.gnupg.org > >iD8DBQE8wXBBfexLsowstzcRArkjAKDJHOgbVyGUz9YYXwX6VJoR23k8YACfVxeO >lJ74TlFfnPByZ+Bhfhi9mUw= >=1Y0e >-----END PGP SIGNATURE----- > > > >