Выполнить инструкцию SELECT и отменить результаты в PL / pgSQL - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь создать простую хранимую процедуру в 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;

1 Ответ

3 голосов
/ 12 марта 2012

Вам необходимо PERFORM "для выполнения инструкции SELECT внутри хранимой процедуры postgresql без необходимости возвращать ее результаты".

В противном случае ваша проблема в том, что команда PL / pgSQL EXECUTE отличается от команды SQL EXECUTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...