Ваши примеры немного беспорядочны.
Первый пример неверен - возможно, неправильное использование ключевого слова IN
и quote_literal()
абсолютно бесполезно в этом контексте. Второй, вероятно, тоже неправильный - если val1
является переменной. переменные plpgsql не отображаются внутри строки SQL в операторе EXECUTE
. Следующий выпуск: INTO
в строке SQL.
postgres=# do $$
DECLARE rc int;
val1 varchar := 'Hello';
BEGIN
rc := (SELECT count(*) FROM xxx WHERE xxx.v = val1);
RAISE NOTICE '%', rc;
EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = $1'
USING val1 INTO rc;
RAISE NOTICE '%', rc;
END;
$$;
NOTICE: 1
NOTICE: 1
DO
quote_literal()
обычно необходимо для динамического SQL, когда вы не можете использовать пункт USING
. В вашем примере:
EXECUTE 'SELECT count(*) FROM xxx WHERE xxx.v = ' || quote_literal(val1)
INTO ...
Он защищает от инъекции SQL и обеспечивает надлежащее экранирование.
Современные релизы имеют format()
функцию:
EXECUTE format('SELECT count(*) FROM xxx WHERE xxx.v = %L', val1) INTO ...
Но EXECUTE ... USING
должно быть предпочтительным.
Вам нужно было бы опубликовать * полное * определение функции, включая заголовок, чтобы быть понятным здесь. –