2017-12-11 13 views
0

データをテキストとして取得し、postgresql関数から配列として返す必要があります。クリップのメディアテーブルにファイルがあり、クリップIDごとにメディアクリップからすべてのファイルを取得したいと考えています。私はこのような機能を作成しました:SQL関数のループからデータを取得する方法

CREATE OR REPLACE FUNCTION clips_media_array(INT) 
RETURNS text[] AS $$ 
    DECLARE 
    r clips_media%ROWTYPE; 
    t text[]; 
    BEGIN 
    FOR r IN 
    SELECT file_name 
    FROM clips_media WHERE id_clips = $1 AND file_type = 2 
    LOOP 
    t := t.file_name; 
    END LOOP; 

    END; 
$$ 
LANGUAGE plpgsql; 

と私はエラーがあります: ERROR: invalid input syntax for integer: "bfeO4RbZ5R1CUT8.jpg" CONTEXT: PL/pgSQL function clips_media_array(integer) line 6 at FOR over SELECT rows

誰もこれで私を助けてもらえますか?

+0

が(エラーメッセージと一致していませんあなたのコードあなたのコードでは 'over'もありません)。しかし、あなたはこれのためにループも関数も必要ありません。単純な 'select array_agg(file_name)from clips_media where ...'はうまくいくでしょう –

答えて

1

あなたは物事をオーバーコンプリートしています。

ループは必要ありません。PL/pgSQL機能は必要ありません。

あなたは、単一のSQLクエリを使用して、単純なSQL関数にそれを置くことができます。

CREATE OR REPLACE FUNCTION clips_media_array(INT) 
RETURNS text[] AS 
$$ 
    SELECT array_agg(file_name) 
    FROM clips_media 
    WHERE id_clips = $1 
    AND file_type = 2; 
$$ 
LANGUAGE sql; 

もちろん、あなたは、関数のオーバーヘッドなしに、あなたのコード内で直接そのSQLクエリを使用することができます。あなたはPL/pgSQL関数をしたい場合


あなたがループ内のカーソル変数から値をCONCATする必要があります:

次のコードが間違っている:

LOOP 
    t := t.file_name; 
END LOOP; 

と次のとおりです。

LOOP 
    t := t || R.file_name; 
END LOOP; 

ループレコードにはR.file_nameを使用し、配列に要素を追加するには||を使用する必要があります。

DECLARE 
    r clips_media%ROWTYPE; 
    t text[] := array[]::text[]; 

そして最後に、あなたはreturnの文が欠落しています:

あなたはまた、あなたの結果変数を初期化する必要が

は、それ以外の場合はnull

LOOP 
    t := t || r.file_name; 
    END LOOP; 
    return t; --<< required to return something from a PL/pgSQL function 
END; 
$$ 
関連する問題