簡體   English   中英

如何將存儲過程參數傳遞給EXECUTE語句

[英]How to pass stored procedure parameter into EXECUTE statement

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($2['||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;
        return curr;
    END IF;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

SELECT "Test"(ARRAY['"Reservation"."status"'],'{"waiting"}');
FETCH ALL IN "<unnamed portal 1>";

我試圖打印出查詢:

"SELECT "Reservation".* FROM "Reservation" WHERE "Reservation"."id" > 0 AND LOWER("Reservation"."status"::character varying) LIKE '%'||LOWER($2[1])||'%' "

但是執行時它說沒有參數$ 2。 因此,我意識到它無法訪問該存儲過程的參數。

我不必擔心sql injection的第一個參數,因為它是硬編碼的。 但是第二個參數必須傳遞給執行。 我怎么做?

我發現可以使用“ USING”語句將參數傳遞給EXECUTE。

這是最終的工作代碼:

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>";

請注意,我在EXECUTE語句中將$ 1作為值,因為它接受$ 2作為其第一個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM