0

次の関数を実行するとエラーが発生します

この行を削除すると機能することに気付きましたAND t.image_id = mviews.image_id

mviews.image_id を定数に変更しても機能します

ループパラメータを正しく参照していないと思いますか?

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

CREATE OR REPLACE FUNCTION test() RETURNS void AS $$
  DECLARE
    mviews RECORD;     
BEGIN        
FOR mviews IN 
SELECT image_id FROM image_index_1205 WHERE image_type = '01' LIMIT 3
LOOP
copy    (

    SELECT encode(decode(image, 'base64'), 'hex') 
    FROM image_index_1205 t
    WHERE image_type = '01'
    AND t.image_id =  mviews.image_id
    LIMIT 1
    ) 
TO
    '/tmp/test.hex';

END LOOP;   
END;
$$ LANGUAGE plpgsql;

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

********** Error **********

ERROR: there is no parameter $1
SQL state: 42P02
Context: SQL statement "copy ( SELECT encode(decode(image, 'base64'), 'hex') FROM image_index_1205 t WHERE image_type = '01' AND t.image_id =  $1  LIMIT 1 ) TO '/tmp/test.hex'"
PL/pgSQL function "test" line 7 at SQL statement

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

4

1 に答える 1

2

問題は、COPY動的 SQL を実行できないことです。変数mviewsは、 のクエリ内では表示されませんCOPY。動的 SQL が必要です。クエリ文字列を作成して使用しますEXECUTE。このような:

CREATE OR REPLACE FUNCTION test()
  RETURNS void AS
$BODY$
DECLARE
    mviews RECORD;     
BEGIN        

FOR mviews IN 
    SELECT image_id FROM image_index_1205 WHERE image_type = '01' LIMIT 3
LOOP
    EXECUTE $x$
    COPY (
       SELECT encode(decode(image, 'base64'), 'hex') 
       FROM   image_index_1205 t
       WHERE  image_type = '01'
       AND    t.image_id =  $x$ || mviews.image_id || $y$
       LIMIT 1
       ) 
    TO '/tmp/test.hex'
    $y$;
END LOOP;   

END;
$BODY$ LANGUAGE plpgsql;

見積もり処理を簡素化するために、私はドル見積もりを多用しています。

宛先ファイルも変更した場合、関数はより理にかなっています。このままでは、反復ごとに前の反復が上書きされ、最後の LOOP の結果のみが保持されます。動的ファイル名にも動的 SQL が必要です。

于 2012-05-15T15:03:55.360 に答える