2012-10-24 34 views
2

我似乎無法找到一種方法將我的查詢作爲參數傳遞給我的sql函數。我的問題是表'my_employees1'可能是動態的。無法將動態查詢傳遞到sql函數

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是一個s –

回答

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$是以美元報價。只要內部標識符不同,它們就可以嵌套。除了允許使用不帶引號的引號和可嵌套的明顯優點之外,它還允許語法突出顯示工作。