Postgresql 如何将存储过程参数传递到EXECUTE语句中

Postgresql 如何将存储过程参数传递到EXECUTE语句中,postgresql,stored-procedures,prepared-statement,plpgsql,Postgresql,Stored Procedures,Prepared Statement,Plpgsql,但是当它执行时,它说没有参数$2。所以我意识到它不能访问存储过程的参数 我不必担心sql注入的第一个参数,因为它是硬编码的。但第二个参数必须传递到执行中。怎么做?我发现可以使用“using”语句将参数传递到EXECUTE 以下是最终工作代码: "SELECT "Reservation".* FROM "Reservation" WHERE "Reservation"."id" > 0 AND LOWER("Reservation"."status"::character varying)

但是当它执行时,它说没有参数$2。所以我意识到它不能访问存储过程的参数


我不必担心sql注入的第一个参数,因为它是硬编码的。但第二个参数必须传递到执行中。怎么做?

我发现可以使用“using”语句将参数传递到EXECUTE

以下是最终工作代码:

"SELECT "Reservation".* FROM "Reservation" WHERE "Reservation"."id" > 0 AND LOWER("Reservation"."status"::character varying) LIKE '%'||LOWER($2[1])||'%' "
创建或替换函数“Test”(字符变化[],字符变化[])
将refcursor返回为
$BODY$
声明
当前参考光标;
过滤文本;
计数器整数;
开始
计数器=1;
过滤器=“”;
如果数组长度($1,1)>0,则
过滤器='和';
而($1[计数器]'')循环
filter=filter | | LOWER(“| |$1[计数器]| |]::字符变化)像“%”LOWER($1[“| |计数器| |])|“%”和“;
计数器=计数器+1;
端环;
filter=子字符串(对于(字符长度(filter)-4)从1开始过滤);
公开兑换
执行“预订”中的“预订”中的“选择预订”。*使用$2筛选“id”>0”;
返回货币;
如果结束;
结束
$BODY$
语言plpgsql VOLATILE
成本100;
选择“测试”(数组['“保留”;“状态”];数组['no-show']);
把所有的东西都收进来;
注意,我在EXECUTE语句中使用$1作为值,因为它接受$2作为第一个参数

"SELECT "Reservation".* FROM "Reservation" WHERE "Reservation"."id" > 0 AND LOWER("Reservation"."status"::character varying) LIKE '%'||LOWER($2[1])||'%' "
CREATE OR REPLACE FUNCTION "Test"(character varying[],character varying[])
RETURNS refcursor AS
$BODY$
DECLARE
curr refcursor;
filter text;
counter integer;
BEGIN
    counter = 1;
    filter = '';

    IF array_length($1,1) > 0 THEN
        filter = 'AND ';

        WHILE ($1[counter] <> '') LOOP
                filter = filter||'LOWER('||$1[counter]||'::character varying) LIKE ''%''||LOWER($1['||counter||'])||''%'' AND ';
                counter = counter + 1;
        END LOOP;

        filter = substring(filter FROM 1 FOR (char_length(filter)-4));

        OPEN curr FOR
         EXECUTE 'SELECT "Reservation".* FROM "Reservation" WHERE "Reservation"."id" > 0 '||filter USING $2;
        return curr;
    END IF;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

SELECT "Test"(ARRAY['"Reservation"."status"'],ARRAY['no-show']);
FETCH ALL IN "<unnamed portal 1>";