5

나는 postgres UDF에서 생성 된 쿼리 문자열을 가지고 있는데, 임시 테이블에 조인을 수행 할 결과를 넣고 싶습니다. LIMITOFFSET을 사용하고 다른 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를

입니다. 대신

답변

6

사용 :

EXECUTE ' 
CREATE TEMP TABLE query_result ON COMMIT DROP AS '|| query_string_; 
  • EXECUTE 전체 문.
    CREATE TABLE foo AS EXECUTE <query> 구문 형식이 유효하지 않습니다.

  • LOCAL은 단순한 노이즈 단어이며이 컨텍스트에서는 무시됩니다.

more.

+0

"간접적 인 수준"의 즐거움 = D 매우 감사합니다. –

관련 문제