関数を介してdblinkを使用してリモートdbからデータをフェッチしようとしていますが、「クエリには結果データの宛先がありません」というエラーが表示されます。同じことをするためにplpgsql言語を使用しています。
関数:
CREATE OR REPLACE FUNCTION fun()
RETURNS text AS
$$
begin
select dblink_connect(
'port=5432 dbname=test user=postgres password=****');
WITH a AS (
SELECT *
FROM dblink(
'SELECT slno,fname,mname,lname
FROM remote_tbl'
) AS t (slno int, fname text, mname text, lname text)
)
, b AS (
INSERT INTO temptab1
SELECT slno, name
FROM a
)
, c AS (
INSERT INTO temptab2
SELECT slno, name
FROM a
)
INSERT INTO temptab3
SELECT slno, name
FROM a;
select dblink_disconnect();
end;
$$
LANGUAGE plpgsql;
呼び出し関数:
select fun();
エラー:クエリには結果データの宛先がありません
ストアドプロシージャは、最後のSELECTの結果を返すだけではありません。実際に値を返す必要があります:
CREATE OR REPLACE FUNCTION fun() RETURNS text AS $$
BEGIN
--- ....
RETURN(SELECT dblink_disconnect());
END
$$ LANGUAGE plpgsql;
Postgresは関数がテキスト型の何かを返すことを期待しているのにエラーを受け取っていますが、関数は何も返しません。
SL2からの回答は正しかったのですが、短い方法で書くことができます。
CREATE OR REPLACE FUNCTION fun() RETURNS text AS $$
BEGIN
--- ....
RETURN(SELECT dblink_disconnect());
END
$$ LANGUAGE plpgsql;
PL/PgSQLの代わりにプレーンなSQL関数を使用するか、SELECT INTO
と通常のRETURN
を使用します。