Я пытаюсь создать простую хранимую процедуру в PostgreSQL, в которой я хочу выполнить инструкцию SELECT.Я не хочу возвращать результаты оператора select.
Если я использую оператор select напрямую, как в следующем коде, я получаю сообщение об ошибке, в котором говорится, что «у запроса нет места назначения для данных результата»
DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;
SELECT * FROM testing.csv_data_already_imported;
GET DIAGNOSTICS affected_rows := ROW_COUNT;
RETURN affected_rows;
END;
Поэтому я использую операторы PREPARE .. EXECUTE, например, так:
DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;
PREPARE fooplan AS SELECT * FROM testing.csv_data_already_imported;
EXECUTE fooplan;
GET DIAGNOSTICS affected_rows := ROW_COUNT;
RETURN affected_rows;
END;
Использование этого метода все еще дает мне ошибки:
ERROR: column "fooplan" does not exist
LINE 1: SELECT fooplan
^
QUERY: SELECT fooplan
CONTEXT: PL/pgSQL function "returning_affected_rows" line 8 at EXECUTE statement
Может кто-нибудь помочь мне понять, чтонеправильно?Хранимая процедура объявлена как функция plpgsql, что означает, что команду EXECUTE не следует рассматривать как как стандартную команду SQL для выполнения операторов динамического SQL.Все, что я хочу знать, это как выполнить инструкцию SELECT внутри хранимой процедуры PostgreSQL без необходимости возвращать ее результаты.Полный DDL хранимой процедуры выглядит следующим образом:
CREATE OR REPLACE FUNCTION testing.returning_affected_rows ()
RETURNS integer AS
$body$
DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;
PREPARE fooplan AS SELECT * FROM testing.csv_data_already_imported;
EXECUTE fooplan;
GET DIAGNOSTICS affected_rows := ROW_COUNT;
RETURN affected_rows;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;