2012-03-12 19 views
1

PostgreSQLでSELECT文を実行したい単純なストアドプロシージャを作成しようとしています。 select文の結果を返す必要はありません。SELECT文を実行してPL/pgSQLで結果を破棄します

私が直接、次のコードのような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; 

「クエリが結果データには先がありません」というエラーを取得するので、私はそうのような文をEXECUTE ... PREPAREを使用します。この方法を使用

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コマンドであるとみなされるべきではありません。私が知りたいのは、結果を返すことなく、PostgreSQLストアドプロシージャ内でSELECT文を実行する方法だけです。次のようにストアドプロシージャの完全な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

あなたは「その結果を返すために必要とすることなく、PostgreSQLのストアド・プロシージャ内でSELECT文を実行するために、」PERFORMを必要としています。

それ以外の場合は、PL/pgSQLのコマンドEXECUTEがSQLコマンドEXECUTEと異なることが問題です。

関連する問題