0

私は、8.3 から構築されたバージョンの postgresql を使用しています。特定の IP アドレスに基づいて大量のクエリを実行し、次のようなパラメーターとして IP アドレスを渡すことができる関数を作成したいと考えました。

CREATE OR REPLACE FUNCTION features.src_forensics(text)     
RETURNS SETOF rows as
$$

select src, action,
count(distinct date_trunc('day', receive_time) ) n_activeDay,
count(distinct source_IP) n_src,
count(distinct source_IP) / count(distinct date_trunc('day', receive_time)) n_src_per_day,
sum(bytes) as total_bytes,
min(receive_time) minTime,
max(receive_time) maxTime
from  table
where src = $1 
group by src, action ;

$$ LANGUAGE sql;

問題は、上記のクエリが select ステートメントの出力を私が慣れ親しんだテーブル形式で返さないことです。関数への IP アドレス入力として 10.10.0.1 を渡す場合、上で書いたスクリプトを以下の select ステートメントのように動作させるにはどうすればよいですか?

select src, action,
count(distinct date_trunc('day', receive_time) ) n_activeDay,
count(distinct source_IP) n_src,
count(distinct source_IP) / count(distinct date_trunc('day', receive_time)) n_src_per_day,
sum(bytes) as total_bytes,
min(receive_time) minTime,
max(receive_time) maxTime
from  table
where src = '10.10.0.1'
group by src, action;
4

1 に答える 1

1

私は通常、任意の列のセットを返すときにこれを行います。

RETURNS TABLE(
    src             text,
    action          text,
    n_activeDay     bigint,
    n_src           bigint,
    n_src_per_day   bigint,
    total_bytes     bigint,
    minTime         timestamptz,
    maxTime         timestamptz
) AS

定義を変更しない場合は、関数のクエリ方法を変更できる場合があります。

select * from features.src_forensics("a") AS f(
        src             text,
        action          text,
        n_activeDay     bigint,
        n_src           bigint,
        n_src_per_day   bigint,
        total_bytes     bigint,
        minTime         timestamptz,
        maxTime         timestamptz
    );
于 2013-02-19T19:28:55.960 に答える