postgresql – Postgres从动态sql字符串创建本地临时表(在提交删
发布时间:2020-12-13 16:02:09 所属栏目:百科 来源:网络整理
导读:我有一个在postgres UDF中生成的查询字符串,我想将它的结果放在临时表中以执行连接(我使用LIMIT和OFFSET,我不想加入其他ttables只是为了结束最后将数据关闭 – 也就是查询计划中的LIMIT运算符.我尝试使用以下语句创建临时表. CREATE LOCAL TEMP TABLE query_
我有一个在postgres UDF中生成的查询字符串,我想将它的结果放在临时表中以执行连接(我使用LIMIT和OFFSET,我不想加入其他ttables只是为了结束最后将数据关闭 – 也就是查询计划中的LIMIT运算符.我尝试使用以下语句创建临时表.
CREATE LOCAL TEMP TABLE query_result ON COMMIT DROP AS EXECUTE query_string_; 但我收到以下错误通知: ********** Error ********** ERROR: prepared statement "query_string_" does not exist SQL state: 26000 Context: SQL statement "CREATE LOCAL TEMP TABLE query_result ON COMMIT DROP AS EXECUTE query_string_" PL/pgSQL function "search_posts_unjoined" line 48 at SQL statement 另外,我试过准备政治家,但我也无法正确使用语法. 有问题的UDF是: CREATE OR REPLACE FUNCTION search_posts_unjoined( forum_id_ INTEGER,query_ CHARACTER VARYING,offset_ INTEGER DEFAULT NULL,limit_ INTEGER DEFAULT NULL,from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL,in_categories_ INTEGER[] DEFAULT '{}' ) RETURNS SETOF forum_posts AS $$ DECLARE join_string CHARACTER VARYING := ' '; from_where_date CHARACTER VARYING := ' '; to_where_date CHARACTER VARYING := ' '; query_string_ CHARACTER VARYING := ' '; offset_str_ CHARACTER VARYING := ' '; limit_str_ CHARACTER VARYING := ' '; BEGIN IF NOT from_date_ IS NULL THEN from_where_date := ' AND fp.posted_at > ''' || from_date_ || ''''; END IF; IF NOT to_date_ IS NULL THEN to_where_date := ' AND fp.posted_at < ''' || to_date_ || ''''; END IF; IF NOT offset_ IS NULL THEN offset_str_ := ' OFFSET ' || offset_; END IF; IF NOT limit_ IS NULL THEN limit_str_ := ' LIMIT ' || limit_; END IF; IF NOT limit_ IS NULL THEN END IF; CREATE LOCAL TEMP TABLE un_cat(id) ON COMMIT DROP AS (select * from unnest(in_categories_)) ; if in_categories_ != '{}' THEN join_string := ' INNER JOIN un_cat uc ON uc.id = fp.category_id ' ; END IF; query_string_ := ' SELECT fp.* FROM forum_posts fp' || join_string || 'WHERE fp.forum_id = ' || forum_id_ || ' AND to_tsvector(''english'',fp.post_text) @@ to_tsquery(''english'','''|| query_||''')' || from_where_date || to_where_date || offset_str_ || limit_str_ || ';'; CREATE LOCAL TEMP TABLE query_result ON COMMIT DROP AS EXECUTE query_string_; RAISE NOTICE '%',query_string_; RETURN QUERY EXECUTE query_string_; END; $$LANGUAGE plpgsql; 当删除相关语句时,它可以正常工作. 解决方法
改为使用:
EXECUTE ' CREATE TEMP TABLE query_result ON COMMIT DROP AS '|| query_string_; >执行整个声明. 更多details in the manual. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |