无法将动态查询传递给sql-function

时间:2012-10-24 17:39:52

标签: sql postgresql sql-function

我似乎无法找到将查询作为参数传递给我的sql-function的方法。我的问题是表'my_employees1'可能是动态的。

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');

1 个答案:

答案 0 :(得分: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$是美元报价。只要内部标识符不同,它们就可以嵌套。除了允许使用不带引号的引号和嵌套之外的明显优势之外,它还允许语法突出显示它的工作。