복붙노트

[SQL] 포스트 그레스 동적 쿼리 기능

SQL

포스트 그레스 동적 쿼리 기능

나는 쿼리를 실행하고 테이블 이름과 기능에 지정된 열 이름의 존재의 arugments와 결과를 반환하는 함수를 작성해야합니다. 나는 현재이 있습니다 :

CREATE OR REPLACE FUNCTION qa_scf(tname character varying, cname character varying)
RETURNS SETOF INT AS
$BODY$
BEGIN
RETURN QUERY SELECT * FROM tname WHERE cname !='AK' AND cname!='CK';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;

이 때 실행 " 'TNAME'데없는 관계"나에게 오류를 제공합니다. 어떤 도움이 감사합니다, 그래서 나는 포스트 그레스에 대한 생성 기능에 새로운 해요. 반환 INT가 잘못 같은 느낌,하지만 난 그것을 반환 된 행에 대한 모든 열을 반환하기 위해 넣어 다른 모르겠어요. 감사!

해결법

  1. ==============================

    1.당신은 그런 식별자 대신에 변수를 사용할 수 없습니다. 당신은 동적 쿼리를 할 필요가있다. 그것은 다음과 같이 보일 것입니다 :

    당신은 그런 식별자 대신에 변수를 사용할 수 없습니다. 당신은 동적 쿼리를 할 필요가있다. 그것은 다음과 같이 보일 것입니다 :

    EXECUTE 'SELECT * FROM ' || quote_ident(tname) 
            || ' WHERE ' || quote_ident(cname) || ' NOT IN (''AK'',''CK'');'
    INTO result_var;
    

    당신은 PostgreSQL의 9.1을 사용하여 이상하는 경우에는 훨씬 쉽게이 문자열을 구성하게 형식 () 함수를 사용할 수 있습니다.

  2. ==============================

    2.테이블 및 컬럼 이름 동적 동적 문으로 실행하는 문자열을 구성하는 파라미터 또는 변수없이 지정 될 수 없다. 포스트 그레스는 동적 문을 실행에 대한 훌륭한 소개 문서를 가지고있다. 그것은 제대로에서 quote_ident () 또는을 quote_literal와 식별자와 리터럴을 인용하는 것이 중요합니다 (). 형식 () 함수는 정리의 동적 SQL 문 건설하는 데 도움이됩니다. 당신이 SETOF INTEGER를 반환하는 함수를 선언하기 때문에, 당신은 당신이하지 *, 원하는 정수 필드를 선택해야합니다.

    테이블 및 컬럼 이름 동적 동적 문으로 실행하는 문자열을 구성하는 파라미터 또는 변수없이 지정 될 수 없다. 포스트 그레스는 동적 문을 실행에 대한 훌륭한 소개 문서를 가지고있다. 그것은 제대로에서 quote_ident () 또는을 quote_literal와 식별자와 리터럴을 인용하는 것이 중요합니다 (). 형식 () 함수는 정리의 동적 SQL 문 건설하는 데 도움이됩니다. 당신이 SETOF INTEGER를 반환하는 함수를 선언하기 때문에, 당신은 당신이하지 *, 원하는 정수 필드를 선택해야합니다.

    CREATE OR REPLACE FUNCTION qa_scf(tname text, cname text)
    RETURNS SETOF INTEGER AS
    $BODY$
    BEGIN
      RETURN QUERY EXECUTE format(
        'SELECT the_integer_field FROM %I WHERE %I NOT IN (%L,  %L)',
                                       tname,   cname,    'AK', 'CK'
      );
    END;
    $BODY$
    LANGUAGE plpgsql;
    
  3. from https://stackoverflow.com/questions/10639963/postgres-dynamic-query-function by cc-by-sa and MIT license