PostgreSQL中的预处理语句

时间:2017-08-07 12:04:45

标签: sql postgresql plpgsql

试图找出如何使用plpgsql编写预处理语句来清理我的代码。

PREPARE statements(text, text, text, text, text, text, text, text, text, text, text, text) AS
                        'SELECT
                            *
                        FROM
                            articles
                        WHERE
                            ' || $1 || ' AND
                            ' || $2 || ' AND
                            primary_category LIKE ''' || $3 || ''' AND
                            ' || $4 || ' AND
                            ' || $5 || ' AND
                            ' || $6 || ' AND
                            ' || $7 || ' AND
                            ' || $8 || ' AND
                            ' || $9 || ' AND
                            ' || $10 || ' AND
                            ' || $11 || ' AND
                            is_template = ' || §12 || ' AND
                            status <> ''DELETED''
                        ORDER BY ' || $13 || ' LIMIT 500';

                    RETURN QUERY EXECUTE statements(search_term, publication_date_query, category_filter, tags_query, districts_query, capability_query, push_notification_query, distance_query, revision_by, publication_priority_query, status_query, only_templates, order_by);

上面的代码返回

ERROR:  syntax error at or near "'SELECT
                        *
                    FROM
                        articles
                    WHERE
                        '"
LINE 67:      'SELECT

我声明我的变量如下:

DECLARE
tags_query text := 'true';
BEGIN
        IF char_length(search_term) > 0 THEN
            order_by := 'ts_rank_cd(textsearchable_index_col, to_tsquery(''' || search_term || ':*''))+GREATEST(0,(-1*EXTRACT(epoch FROM age(last_edited)/86400))+60)/60 DESC';
            search_term := 'to_tsquery(''' || search_term || ':*'') @@ textsearchable_index_col';
        ELSE
            search_term := 'true';
        END IF;
...

我是新手,请不要立刻吓坏,如果是傻事,我没注意到。

编辑:PostgreSQL版本9.6

编辑:我知道documentation

1 个答案:

答案 0 :(得分:0)

我看到更多问题。

  1. PLpgSQL不支持显式准备的命令 - 因此SQL EXECUTE命令与PLpgSQL EXECUTE命令不同。 PLpgSQL EXECUTE命令的参数是SQL字符串 - 不是准备命令的名称。有没有干净的方法,如何从PLpgSQL执行SQL显式编写的命令。因此,PLpgSQL中的组合PREPARE cmd(); EXECUTE cmd()没有任何意义。
  2. 预备语句的参数应该是干净的值 - 它不能在撇号中使用。 `'$ n'是另一个废话。只需$ n就是安全的。 '$ n'表示字符串“$ n”可能与您预期的不同。