3

postgres 9.3 で sql を使用して関数内で関数を呼び出そうとしています。

この質問は、私の別の投稿に関連しています。

以下の関数を書きました。これまでのところ、どの種類の出力保存 (COPY) ステートメントも組み込むことができませんでした。そのため、ネストされた関数の出力関数を作成することで、これを回避しようとしています。

CREATE FUNCTION retrieve_info(TEXT, TEXT) RETURNS SETOF   
retrieve_info_tbl AS $$
 SELECT tblA.id, tblA.method, tblA.species, tblA.location
 FROM tblA
 WHERE method=$1 AND species=$2
 GROUP BY id, method, species
 ORDER BY location
$$ LANGUAGE 'sql';

上記の機能が動作します。

ネストされた関数を作成しようとしています。

CREATE FUNCTION print_out(TEXT, TEXT) RETURNS void AS $$
 COPY (SELECT * FROM retrieve_info($1, $2)) TO 'myfilepath/test.csv'    
 WITH CSV HEADER;
$$ LANGUAGE 'sql';

ネストされた関数を呼び出しています。

SELECT * FROM print_out('mtd1','sp1');

出力

上記はこれを与えますERROR: column "$1" does not exist SQL state: 42P02 Context: SQL function "print_out" statement 1。ただし、print_out() の arg1、arg2 を 'mtd1','sp1' に置き換えると、正しい出力が test.csv に出力されます (以下を参照)。

id | method | ind | location
----------------------------
1a | mtd1   | sp3 | locA
1d | mtd1   | sp3 | locB

arg1、arg2 を print_out() 内で適切に呼び出すには、retrieve_info() の arg1、arg2 を取得するにはどうすればよいですか?

私は完全に立ち往生しています。ポインタをいただければ幸いです、ありがとう

4

2 に答える 2

0

x意図的にy引用されていますか?

COPY (SELECT * FROM retrieve_info('x','y')) TO 'myfilepath/test.csv'

xとのy引数をprint_outto に送信するのretrieve_infoではなく、文字列'x'andを送信しています'y'。のレコードがないと仮定するとmethod='x' AND species='y'、結果が得られないのも不思議ではありません。

代わりにこれを試してください:

COPY (SELECT * FROM retrieve_info(x,y)) TO 'myfilepath/test.csv'
于 2013-11-12T02:06:52.177 に答える