2012-05-10 3 views
1

이름이 주어진 테이블의 내용을 반환하는 plpgsql 함수가 필요합니다. 아래의 기능은 여러 가지 이유로 인해 작동하지 않지만 일반적인 아이디어를 제공합니다. 안전과 코딩 연습을 제쳐두고, 이것을 달성하는 가장 쉬운 방법은 무엇입니까?함수 반환 테이블

결국이 결과를 Java CallableStatement를 통해 얻고 싶습니다.

CREATE OR REPLACE FUNCTION get_table(tablename VARCHAR) 
RETURNS SETOF RECORD AS $PROC$ 
BEGIN 
    RETURN QUERY SELECT * FROM tablename; 
END; 
$PROC$ LANGUAGE 'plpgsql'; 

답변

3

당신이 얻을 수있는이 같은 일 함수 : 모든 반환 컬럼 이름과 데이터 유형을 지정해야합니다 호출하기 위해

CREATE OR REPLACE FUNCTION get_table(tablename VARCHAR) 
RETURNS SETOF RECORD AS $PROC$ 
BEGIN 
    RETURN QUERY EXECUTE 'SELECT * FROM ' || quote_ident(tablename); 
END; 
$PROC$ LANGUAGE 'plpgsql'; 

. 당신이 두 개의 열이있는 테이블 "T"를 나열 할 경우,이 같은 함수를 사용할 수 있습니다

은 물론, 더 이상이며,보다 더 많은 문제가
SELECT * FROM get_table('t') x(id int, val text); 

어느 하나 :

SELECT * FROM t; 

또는 그 동등한 것 :

TABLE t; 

나는 그런 기능이 더 나은 것을 만드는 유스 케이스를 정말로 상상할 수 없다.

+0

정보 주셔서 감사합니다. 다른 사용자를 위해 다른 스키마를 설정 한 상황에서 유용하지만,보고 시스템에서는 'search_path'를 올바르게 변경할 수 없습니다. 이렇게하면 함수에 쿼리를 전달하는 문제를 해결할 수 있으며 함수는 적절하게'search_path'를 설정 한 다음 쿼리를 실행하고 결과를 반환합니다. (그리고'RETURN QUERY'는 다중 질의 또는 비 선택 질의를 허용하지 않으므로 안전하게 보관할 수 있습니다.) –