【发布时间】:2012-10-03 11:20:26
【问题描述】:
我在数据库中有一个表:
create table store (
...
n_status integer not null,
t_tag varchar(4)
t_name varchar,
t_description varchar,
dt_modified timestamp not null,
...
);
在我的存储函数中,我需要对这个表多次执行相同的select:
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;
这里,t_search 和 n_max 是存储函数的参数。我认为为此使用准备好的语句是有意义的,但我遇到了奇怪的问题。这是我所拥有的:
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;
但是当我实际运行该函数时
select * from fn_get_data('', 30)
我收到此错误:
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
好的,可能它不喜欢prepared statement中的外部变量,所以我把它改成了
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)
...
这次我得到一个不同的错误:
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)
我在这里错过了什么?
EDIT我在顶部添加了相关的表结构。
【问题讨论】:
-
显示的代码声明了一个带有 2 个参数的函数
fn_get_data(),但您使用 1 个参数调用它,因此实际调用的函数不是您显示的函数。在 psql 中尝试\df fn_get_data。 -
@DanielVérité 你好?请仔细阅读问题。我的问题不在于调用该函数。我正在声明一个准备好的声明,由于某种原因,postgres 没有正确解释。
-
阅读您的错误消息:prepare 抱怨以
select * from store where n_status > 0开头的查询,而您显示的代码甚至没有引用n_status。再说一遍:你没有执行你认为的代码。 -
@DanielVérité 好吧,也许我的问题不是很清楚。我用更多信息更新了它。您所说的完全无关紧要,尤其是考虑到更新的问题。我正在执行我认为的代码。我从一个完全正常工作的存储函数开始,我要做的就是提取一个重复的
select,并使用一个准备好的语句代替它使用select。
标签: postgresql prepared-statement plpgsql