2012-10-24 4 views
2

SQL 쿼리에 매개 변수로 내 쿼리를 전달하는 방법을 찾지 못하는 것 같습니다. 내 문제는 테이블 'my_employees1'동적 수 있습니다.은 sql-function에 동적 쿼리를 전달할 수 없습니다.

DROP FUNCTION function_test(text); 
CREATE OR REPLACE FUNCTION function_test(text) RETURNS bigint AS ' 
    DECLARE ret bigint; 
    BEGIN 
     SELECT count(mt.id) INTO ret 
    FROM mytable as mt 
    WHERE mt.location_id = 29671 
    --and mt.employee_id in (SELECT id from my_employees1); 
    --and mt.employee_id in ($1); 
    $1; 
    RETURN ret; 
    END; 
' LANGUAGE plpgsql; 

select function_test('and mt.employee_id in (SELECT id from my_employees1)'); 
select function_test('SELECT id from my_employees1'); 
+0

이 문제는 동적 SQL로 해결할 수 있습니다. [시작하려면 여기를보십시오] (http://www.postgresql.org/docs/8.1/static/ecpg-dynamic.html)를 가져 가십시오. 코드의 어느 시점에서 쿼리 이름과 테이블 열의 이름을 알아낼 수 있어야합니다. 또한 전체 SQL 문은 동적 문자열이어야합니다. 임의로 SQL 코드에 텍스트를 추가 할 수는 없습니다. 함수에서 동적 인 것을 만들기 위해 텍스트 변수를 기존 SQL 코드의 문자열에 추가/삽입합니다. 이제이 작업을 수행 할 수 있지만 리팩터링 할 수 있는지 알아보기 위해 데이터 모델을 살펴 보는 것이 좋습니다. ** 동적 SQL은 –

답변

0

는 동적으로 작성해야합니다

DROP FUNCTION function_test(text); 
CREATE OR REPLACE FUNCTION function_test(text) RETURNS bigint AS $$ 
    DECLARE 
     ret bigint; 
    BEGIN 
    execute(format($q$ 
     SELECT count(mt.id) INTO ret 
     FROM mytable as mt 
     WHERE mt.location_id = 29671 
     %s; $q$, $1) 
    ); 
    RETURN ret; 
    END; 
$$ LANGUAGE plpgsql; 

$$$q$ 달러 시세입니다. 내부 식별자가 다른 한 중첩 될 수 있습니다. 따옴표로 묶지 않은 따옴표를 사용할 수 있다는 확실한 이점 외에도 구문 중첩 기능을 작동시킬 수 있습니다.