5
나는 postgres UDF에서 생성 된 쿼리 문자열을 가지고 있는데, 임시 테이블에 조인을 수행 할 결과를 넣고 싶습니다. LIMIT
및 OFFSET
을 사용하고 다른 ttable과 조인하지 말고 끝에있는 데이터를 잘라내기만하면됩니다 (쿼리 계획의 LIMIT 연산자). 다음 문으로 임시 테이블을 만들려고합니다.Postgres 동적 SQL 문자열에서 로컬 임시 테이블을 만들 때
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
또한, 나는 statemen를 준비하는 시도를하지만 바로 하나의 구문을 가져올 수 없습니다.
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;
그리고 문제의 문이 제거 될 때 작동 : 문제
UDF를
입니다. 대신
"간접적 인 수준"의 즐거움 = D 매우 감사합니다. –