繁体   English   中英

PL / pgSQL中的变量替换

[英]Variable substitution in PL/pgSQL

我有一个基于提供的参数动态生成的select语句。 问题是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

如果要在函数内部生成动态命令,则需要EXECUTE 您还可以使用两个不同的部分:

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;

EXECUTE是PL / pgSQL语句而不是SQL语句。 所以你必须将动态查询包装到PL / pgSQL存储过程中。

注意变量替换,在构建查询时不要忘记使用quote_literal()quote_nullable()

在这里查看文档: http : //www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM