2016-06-10 3 views
1

그래서 야간에 생성해야하는 테이블이 있습니다. 예를 들어 foo_01jan16, foo_02jan2016, foo_03jan2016 등과 같은 테이블이 있습니다. 또한 매일 실행하는 다른 쿼리에서이 테이블을 참조합니다. 그러나 찾기 및 바꾸기는 비효율적으로 보입니다. 제가하고 싶은 것은이 과정을 자동화하는 것입니다. 그런 다음 쿼리에서 내가 table_date()를 참조 할 수 있습니다날짜 별 동적 테이블 이름

CREATE OR REPLACE FUNCTION table_date() RETURNS text AS $$ 
      SELECT 'foo_'||to_char(current_timestamp, 'DDMONYY') AS result 
    $ LANGUAGE SQL; 

: 내가 좋아하는 뭔가를하고 싶어? 즉

CREATE TABLE table_date() AS 
    SELECT * FROM base_table WHERE date <= current_date; 

    SELECT * FROM table_date() LIMIT 10; 

그런 것. PostgreSQL 8.2를 사용하고 있습니다.

감사

+0

.. –

+2

PG 8.2보다 이전 아이폰! 4.5 년 후에는 버그 및 보안 픽스와 같은 지원이 없었습니다. 작년에 직접 제작하지 않았다면 [Heartbleed] (http://heartbleed.com)와 같은 "멋진 기능"을 가지고 있습니다. 업그레이드! – Patrick

+0

[postgreSQL에 대한 변수 참조]의 가능한 복제본 (http://stackoverflow.com/questions/37738042/variable-reference-for-postgresql) – Nicarus

답변

1

아니, 당신이 할 수없는 PG는 테이블 이름이 아닌 일부 표현을위한 문자열 리터럴이 필요하기 때문이다. 평소처럼 PL/pgSQL 함수에서 동적 쿼리 형태로 PG에 해결 방법이 있습니다.

먼저 당신은 테이블을 만들고 그것을 채울 수 있습니다 SELECT todays_data(); :

CREATE FUNCTION todays_data() RETURNS void AS $$ 
BEGIN 
    EXECUTE 'CREATE TABLE foo_' || to_char(CURRENT_DATE, 'DDMONYYYY') || 
      ' AS SELECT * FROM base_table WHERE date <= CURRENT_DATE'; 
END; 
$$ LANGUAGE plpgsql; 

당신은 하루에 한 번이 함수를 호출해야합니다.

CURSOR을 사용하여 각 쿼리에 대해 함수를 만들어야합니다. 이것은 오늘날의 표준에서는 다소 비효율적이지만 PG 8.2는 RETURN NEXT QUERY을 지원하지 않기 때문에 아래의 기능을 단일 명령문으로 해결할 수 있습니다. 그래서, 어려운 방법 :

CREATE FUNCTION someday_query1(dt date) RETURNS SETOF base_table AS $$ 
DECLARE 
    cur refcursor; 
    rec base_table%ROWTYPE; 
BEGIN 
    OPEN cur FOR EXECUTE 'SELECT * FROM foo_' || to_char(dt, 'DDMONYYYY') || 
         ' WHERE some_condition'; 
    FETCH cur INTO rec; 
    WHILE FOUND LOOP 
    RETURN NEXT rec; 
    FETCH cur INTO rec; 
    END LOOP; 
    CLOSE cur; 
END; 
$$ LANGUAGE plpgsql STRICT; 

는 그런 다음과 같이 쿼리를 호출 할 수 있습니다?

SELECT * FROM someday_query1(CURRENT_DATE); 

또는

SELECT * FROM someday_query1('2016-01-23'); 
는 8.2셨어요
+0

그래서 작은 장난감 테이블을 가지고 이것을 시도해 보았습니다. 에러를 반환하고 있습니다 :'RETURN NEXT는 함수에서 레코드 나 행 변수를 지정해야합니다 ...'RETURN NEXT 'SELECT에 문제가있는 것 같습니다. ' – windsormatic

+0

문서에서 분명하지 않지만 확인은 가능합니다. 위의 대체 접근법을 참조하십시오. 이것이 작동하지 않으면 운이 없어집니다. – Patrick