I have a table in the database:
create table store ( ... n_status integer not null, t_tag varchar(4) t_name varchar, t_description varchar, dt_modified timestamp not null, ... );
In my saved function, I need to execute the same select several times on this table:
select * from store where n_place_id = [different values] and t_tag is not null and n_status > 0 and (t_name ~* t_search or t_description ~* t_search) order by dt_modified desc limit n_max;
Here t_search and n_max are parameters in the stored function. I thought it made sense to use a prepared expression for this, but I am having strange problems. Here is what I have:
create or replace function fn_get_data(t_search varchar, n_max integer) returns setof store as $body$ declare resulter store%rowtype; mid integer; begin prepare statement prep_stmt(integer) as select * from store where n_place_id = $1 and (t_name ~* t_search or t_description ~* t_search) order by dt_modified limit n_max; for mid in (select n_place_id from ... where ...) loop for resulter in execute prep_stmt(mid) loop return next resulter; end loop; end loop; end;$body$ language 'plpgsql' volatile;
However, when I actually run the function with
select * from fn_get_data('', 30)
I get this error:
ERROR: column "t_search" does not exist LINE 3: and (t_name ~* t_search or t_description ~* t_search) ^ QUERY: prepare prep_stmt(integer) as select * from store where n_status > 0 and t_tag is not null and n_museum = $1 and (t_name ~* t_search or t_description ~* t_search) order by dt_modified desc limit maxres_free
Well, maybe he doesn't like external variables in a prepared statement, so I changed this to
prepare prep_stmt(integer, varchar, integer) as select * from store where n_status > 0 and t_tag is not null and n_museum = $1 and (t_name ~* $2 or t_description ~* $2) order by dt_modified desc limit $3 ... for resulter in execute prep_stmt(mid, t_search, n_max) ...
This time I get another error:
ERROR: function prep_stmt(integer, character varying, integer) does not exist LINE 1: SELECT prep_stmt(mid, t_search, n_max) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT prep_stmt(mid, t_search, n_max)
What am I missing here?
EDIT I added the corresponding table structure at the top.