pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Robert Treat <xzilla@users.sourceforge.net>
To: pgsql-sql@postgresql.org
To: emilu@encs.concordia.ca
Cc: A. Kretschmer <andreas.kretschmer@schollglas.com>
Subject: Re: in PlPgSQL function, how to use variable in a "select ...
Date: Fri, 17 Mar 2006 16:35:35 -0500
Message-ID: <200603171635.35661.xzilla@users.sourceforge.net> (raw)
In-Reply-To: <441B1D0E.3000109@encs.concordia.ca>
References: <441AF775.7060006@encs.concordia.ca>
	<20060317195031.GA8508@webserv.wug-glas.de>
	<441B1D0E.3000109@encs.concordia.ca>

On Friday 17 March 2006 15:33, Emi Lu wrote:
> >>Does not work either, the whole function is:
> >>
> >>create table t1(col1 varchar(3), col2 varchar(100));
> >>insert into t1 values('001', 'Result 1');
> >>insert into t1 values('002', 'Result 2');
> >>insert into t1 values('003', 'Result 3');
> >>
> >>CREATE OR REPLACE FUNCTION test(VARCHAR) RETURNS VARCHAR AS $$
> >>DECLARE
> >>   col1_value                ALIAS FOR $1;
> >>cm_tableName           st1_legend.code_map_tablename%TYPE;
> >>lengendTableName    VARCHAR := 't1';
> >>   query_value                VARCHAR ;
> >>BEGIN
> >>
> >>   SELECT INTO cm_tableName col2 FROM lengendTableName WHERE col1 =
> >>col1_value ;
> >
> >This can't work, read the docu:
> >http://www.postgresql.org/docs/8.1/interactive/plpgsql-statements.html#PLP
> >GSQL-STATEMENTS-EXECUTING-DYN
> >
> >You should build a string with your SQL and EXECUTE this string.
>
> Thank you Andreas. Unfortunately it did not work. maybe I made something
> wrong?
>
> drop table t1;
> create table t1(col1 varchar(3), col2 varchar(100));
> insert into t1 values('001', 'Result 1');
> insert into t1 values('002', 'Result 2');
> insert into t1 values('003', 'Result 3');
>
> CREATE OR REPLACE FUNCTION test(VARCHAR) RETURNS VARCHAR AS $$
> DECLARE
>   col1_value                ALIAS FOR $1;
>   cm_tableName           st1_legend.code_map_tablename%TYPE;
>   lengendTableName    VARCHAR := 't1';
>   query_value                VARCHAR ;
> BEGIN
>   query_value := 'SELECT col2 FROM lengendTableName WHERE col1 = \'' ||
> col1_value || '\'';
>
>   EXECUTE query_value INTO cm_tableName;
>
>   RETURN cm_tableName;
> END;
> $$ language 'plpgsql' IMMUTABLE STRICT;
> select test('001');
>

This function would work on 8.1, provided you created the sql statement 
correctly:

 query_value := 'SELECT col2 FROM ' ||lengendTableName||' WHERE col1 = \'' || 
col1_value || '\'';

>
> I am using postgresql 8.0.1, and I am afraid that 8.0 does not support
> "excecute ... into ...."
>

In which case you could use:

 FOR cm_tableName IN EXECUTE query_value LOOP
	RETURN cm_tableName
 END LOOP						

which is a little hacky, though you could use a second variable for assignment 
if you felt strongly about it. 

-- 
Robert Treat
Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL



view thread (5+ messages)

Message-ID: <200603171635.35661.xzilla@users.sourceforge.net>
Permalink:  ../200603171635.35661.xzilla@users.sourceforge.net/
Also on:    postgresql.org/message-id/200603171635.35661.xzilla@users.sourceforge.net

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: xzilla@users.sourceforge.net, emilu@encs.concordia.ca, andreas.kretschmer@schollglas.com
  Subject: Re: in PlPgSQL function, how to use variable in a "select ...
  In-Reply-To: <200603171635.35661.xzilla@users.sourceforge.net>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox