Thread: Dynamically access to field on a RECORD variable
Supose I have this function CREATE OR REPLACE my_func(TEXT) RETURNS text AS ' DECLARE var_name ALIAS FOR $1; rec RECORD; BEGIN SELECT * INTO rec FROM my_table WHERE my_key = 1; -- Here is my problem RETURN rec.var_name; END; ' LANGUAGE plpgsql; SELECT my_func('my_field'); I want the return row in the function executes as: RETURN rec.my_field; Is it possible? Thank you. -- Ricardo Vaz Mannrich <rvm_l1@silcom.com.br>
Hello, It's not possible. Not in plpgsql. Its possible in plperl or plpython or pltcl. But you can do CREATE OR REPLACE FUNCTION my_fce(text) returns text AS $$ DECLARE _r RECORD; BEGIN FOR _r IN EXECUTE 'SELECT '||$1||' AS _c FROM my_table ...' LOOP RETURN _r._c; END LOOP; END; $$ LANGUAGE plpgsql; or if you know all possible columns names BEGIN SELECT INTO _r * FROM my_tab ... RETURN CASE $1 WHEN 'c1' THEN _r.c1 .... END; END; $$ LANGUAGE plpgsql; regards Pavel Stehule On 3 May 2005, Ricardo Vaz Mannrich wrote: > Supose I have this function > > CREATE OR REPLACE my_func(TEXT) RETURNS text AS ' > DECLARE > var_name ALIAS FOR $1; > rec RECORD; > BEGIN > SELECT * INTO rec FROM my_table WHERE my_key = 1; > -- Here is my problem > RETURN rec.var_name; > END; > ' LANGUAGE plpgsql; > > SELECT my_func('my_field'); > > I want the return row in the function executes as: > > RETURN rec.my_field; > > Is it possible? > > Thank you. > >
Ricardo Vaz Mannrich <rvm_l1@silcom.com.br> writes: > Is it possible? Not in plpgsql. I believe you could do it in any of the other PLs though. regards, tom lane
I am newbie. Could you give a example? Thank you. > Ricardo Vaz Mannrich <rvm_l1@silcom.com.br> writes: > > Is it possible? > > Not in plpgsql. I believe you could do it in any of the other PLs though. > > regards, tom lane > > ---------------------------(end of broadcast)--------------------------- > TIP 9: the planner will ignore your desire to choose an index scan if your > joining column's datatypes do not match
If it's not possible, can I create a function that gets a RECORD and a tablename and returns the correct value. For example: CREATE FUNCTION my_value(TEXT, RECORD) RETURNS TEXT AS ' DECLARE table_name ALIAS FOR $1 rec ALIAS FOR $2 BEGIN IF (table_name = 'my_table1') THEN RETURN rec.my1_field; ELSIF (table_name = 'my_table2') THEN RETURN rec.my2.field; ... END; ' LANGUAGE plpgsql; Em Ter, 2005-05-03 às 11:52, Tom Lane escreveu: > Ricardo Vaz Mannrich <rvm_l1@silcom.com.br> writes: > > Is it possible? > > Not in plpgsql. I believe you could do it in any of the other PLs though. > > regards, tom lane -- Ricardo Vaz Mannrich <rvm_l1@silcom.com.br>
Hi I've downloaded the zip binaries of postgresql 8.0.3 from some of the mirrors. All of the dowmloaded files are corrupt. With best regards. -- Mario Günterberg mattheis. werbeagentur IT Engineer / Projektleiter Zillestrasse 105a. D - 10585 Berlin Tel#49-(0)30 . 34 80 633 - 0 Fax#49-(0)30 . 34 80 633 50 http://www.mattheis-berlin.de