Hi,
I ran into a roadblock at the very bottom of a fairly large database
design implementation. It will be at least messy to fix, unless there is
a neat solution.
The roadblock is:
There is a record, which may be from any of a set of similar databases.
Field names for this record are computed as strings. Using these strings,
I need to access fields of the record.
But I can't find the syntax for it.
Now, if a record variable is a known row type, I can get a field of a
computed name.
For a generic RECORD I can get a field by putting an explicit name the code,
(rec).FieldName1
But can one get the value of a computed field from a generic RECORD?
With
rec RECORD;
field TEXT;
The following all fail:
res := rec.field; -- ERROR: record "rec" has no field "field"
res := (rec.field); -- ERROR: record "rec" has no field "field"
res := (rec).field; -- ERROR: syntax error at or near "$2"
res := rec.(field); -- ERROR: syntax error at or near "("
res := rec."FieldName1"; -- gets field, but isn't what is needed
I also tried numerous other things that were doomed to fail.
Find an example file attached. Just "\i" it and play with the possibilites.
Thanks!
--
| - - - - - - - - - - - - - - - - - - - - - - - - -
| Steve White +49(331)7499-202
| e-Science / AstroGrid-D Zi. 35 Bg. 20
| - - - - - - - - - - - - - - - - - - - - - - - - -
| Astrophysikalisches Institut Potsdam (AIP)
| An der Sternwarte 16, D-14482 Potsdam
|
| Vorstand: Prof. Dr. Matthias Steinmetz, Peter A. Stolz
|
| Stiftung privaten Rechts, Stiftungsverzeichnis Brandenburg: III/7-71-026
| - - - - - - - - - - - - - - - - - - - - - - - - -
-- vim:set filetype=pgsql:
SET client_min_messages TO "NOTICE";
CREATE TABLE example1 (
"FieldName1" INTEGER PRIMARY KEY
);
INSERT INTO example1 ("FieldName1") VALUES ( 1 );
-- -------------------------------------------------------------------------
CREATE FUNCTION get_field_from_cursor( field TEXT, curs REFCURSOR )
RETURNS INTEGER AS $body$
DECLARE
rec RECORD;
res INTEGER;
BEGIN
RAISE NOTICE 'Getting field %', field;
FETCH curs INTO rec;
--res := rec.field; -- ERROR: record "rec" has no field "field"
--res := (rec.field); -- ERROR: record "rec" has no field "field"
--res := (rec).field; -- ERROR: syntax error at or near "$2"
--res := rec.(field); -- ERROR: syntax error at or near "("
--res := rec."FieldName1"; -- gets field, but isn't what is needed
--SELECT INTO res field FROM rec; -- ERROR: syntax error at or near
"$2"
return res;
END;
$body$ LANGUAGE PLPGSQL;
-- -------------------------------------------------------------------------
CREATE FUNCTION test()
RETURNS VOID AS $body$
DECLARE
curs REFCURSOR;
result INTEGER;
BEGIN
OPEN curs FOR SELECT * FROM example1;
result := get_field_from_cursor( 'FieldName1', curs );
RAISE NOTICE 'Got field %', result;
END;
$body$ LANGUAGE PLPGSQL;
-- -------------------------------------------------------------------------
GRANT SELECT ON example1 TO PUBLIC;
SELECT test();
-- -------------------------------------------------------------------------
DROP TABLE example1;
DROP FUNCTION test();
DROP FUNCTION get_field_from_cursor( TEXT, REFCURSOR);
--
Sent via pgsql-general mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general