Подстановка переменных в PL / pgSQL - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть оператор выбора, который генерируется динамически на основе предоставленного параметра.Проблема в том, что postgresql всегда говорит:

argument of WHERE must be type boolean, not type character varying независимо от того, какой это параметр.Я что-то пропустил?

CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$
    DECLARE 
        statement varchar;
        uid integer;
    BEGIN
        IF ($1 = '') THEN
            statement := 'TRUE';
            statement := CAST(statement AS BOOLEAN);
        ELSE
            statement := 'users.keywords ILIKE''' || '%' || $1 || '%''';
        END IF;
        SELECT INTO uid id FROM users WHERE "statement";
        RETURN uid;
    END;
$$ LANGUAGE plpgsql

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

Вам нужно ВЫПОЛНИТЬ , если вы хотите генерировать динамические команды внутри функции. Вы также можете использовать два разных раздела:

CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$
    DECLARE 
        statement varchar;
        uid integer;
    BEGIN
        IF ($1 = '' OR $1 IS NULL) THEN -- section 1
            SELECT id INTO uid FROM users;
        ELSE -- section 2
            SELECT id INTO uid FROM users WHERE users.keywords ILIKE '%' || $1 || '%';
        END IF;

        RETURN uid;
    END;
$$ LANGUAGE plpgsql;
0 голосов
/ 30 ноября 2010

EXECUTE - это оператор PL / pgSQL, а не оператор SQL. Таким образом, вы должны обернуть ваш динамический запрос в хранимую процедуру PL / pgSQL.

Будьте осторожны с подстановкой переменных и не забывайте использовать quote_literal() или quote_nullable() при построении запроса.

Посмотрите в документации здесь: http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

...