在plpgsql函数中使用ltree查询作为PostgreSQL中的param

时间:2013-09-10 16:08:51

标签: postgresql plpgsql ltree

我想在plpgsql函数中使用ltree param执行查询...但是我不能理解如何在这个函数中使用引号......

CREATE OR REPLACE FUNCTION f_select(BIGINT) RETURNS setof categories AS 
$$
DECLARE
    s_cat ALIAS FOR $1;

    queryText TEXT;
    result categories%ROWTYPE;

BEGIN
    queryText := 'SELECT * FROM categories WHERE cat_tree ~ \'*.\'|| s_cat::text ||\'.*\'';

    FOR result IN EXECUTE queryText
    LOOP
        RETURN NEXT result;
    END LOOP;

    RETURN;

END
$$
LANGUAGE plpgsql;

怎么做???

在psql中执行此代码后,我收到错误:

ERROR:  syntax error at or near "."
LINE 10: ... := 'SELECT * FROM categories WHERE cat_tree ~ \'*.\'|| s_ca...

最终工作证书:

CREATE OR REPLACE FUNCTION f_select(BIGINT) RETURNS setof categories AS 
$$
DECLARE
    s_cat ALIAS FOR $1;

    queryText TEXT;
    result categories%ROWTYPE;

BEGIN

    queryText := 'SELECT * FROM categories WHERE cat_tree ~ ''' || ('*.'|| s_cat::text || '.*')::lquery || '''';

    FOR result IN EXECUTE queryText
    LOOP
        RETURN NEXT result;
    END LOOP;

    RETURN;

END
$$
LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:1)

问题似乎是滥用反斜杠,但无论如何都不应该首先将此查询放入文本变量中。

这种形式怎么样:

FOR result IN SELECT * FROM categories WHERE cat_tree ~ '*.'|| s_cat::text || '.*'
LOOP
    RETURN NEXT result;
END LOOP;

如果LOOP只需要返回结果,你也可以避免它并直接返回查询:

 RETURN QUERY SELECT * FROM categories WHERE cat_tree ~ '*.'|| s_cat::text || '.*';

修改 由于运算符为ltree ~ lquery~||更紧密,因此右操作数应加括号并转换为lquery

 RETURN QUERY SELECT * FROM categories
   WHERE cat_tree ~ ('*.'|| s_cat::text || '.*')::lquery;