2012-03-12 3 views
1

Я пытаюсь создать простую хранимую процедуру в PostgreSQL, в которой я хочу выполнить инструкцию SELECT. Я не хочу возвращать результаты выражения select.Выполнять инструкцию SELECT и отбрасывать результаты в PL/pgSQL

Если я использую оператор выбора непосредственно как следующий код, я получаю сообщение об ошибке, что «запрос не имеет места для результирующих данных»

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; 

Поэтому я использую ГОТОВЯТ .. 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; 

ответ

3

Вам нужно PERFORM «чтобы выполнить ЗЕЬЕСТ внутри хранимой процедуры PostGreSQL без необходимости возвращать свои результаты».

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

Смежные вопросы