2017-12-11 26 views
0

테이블에 새 레코드의 수를 얻기 위해 Postgres 함수를 작성했습니다. 여기서 테이블 이름은 변수입니다. 동적 SQL에서 테이블 이름에 대한 인수를 사용하는 방법

create or replace function dmt_mas_updates(
    tb_name text, 
    days integer) 
    returns integer as 
$$ 
declare 
    ct integer; 
begin 
    execute 'select count(*) from $1 where etl_create_dtm > now() - $2 * interval ''1 days'' ' 
    using tb_name, days into ct; 
    return ct; 

end; 
$$ LANGUAGE 'plpgsql' 

내가 select * from dmt_mas_updates('dmt_mas_equip_store_dim',2);와 함수를 호출

, 나는 $1에서 구문 오류가 발생했습니다.

쿼리를 직접 실행하면 select count(*) from dmt_mas_equip_store_dim where etl_create_dtm >= interval '3 days', 제대로 작동합니다.

왜이 오류가 발생합니까? 나는 무엇을 잘못 했는가?

답변

2

매개 변수 기호 만 데이터 값에 사용할 수 the documentation:

주 당 - 당신이 동적으로 결정 테이블 또는 열 이름을 사용하려는 경우, 당신은 텍스트로 명령 문자열에 삽입해야합니다.

create or replace function dmt_mas_updates(
    tb_name text, 
    days integer) 
    returns integer as 
$$ 
declare 
    ct integer; 
begin 
    execute format(
     'select count(*) from %I where etl_create_dtm > now() - $1 * interval ''1 days'' ', 
     tb_name) 
    using days into ct; 
    return ct; 

end; 
$$ LANGUAGE 'plpgsql'; 
:

format() 기능을 사용하여