-- Function: f_access_increment(IN int4, IN date, IN "varchar", IN "varchar", OUT errcd int4, OUT errmsg "varchar")

-- DROP FUNCTION f_access_increment(IN int4, IN date, IN "varchar", IN "varchar", OUT errcd int4, OUT errmsg "varchar");

CREATE OR REPLACE FUNCTION f_access_increment(IN int4, IN date, IN "varchar", IN "varchar", OUT errcd int4, OUT errmsg "varchar") AS
$BODY$

DECLARE
     i_itemcd ALIAS FOR $1;            -- 品目C
     i_accessdate ALIAS FOR $2;        -- アクセス日

     i_updusrnm ALIAS FOR $3;          -- 更新ユーザ名
     i_updpcnm ALIAS FOR $4;           -- 更新マシン

     i        integer;
     cntcheck integer;
BEGIN

    IF i_itemcd IS NULL THEN
        errmsg := '品目コードが指定されていません。';
        errcd := -10;
        RETURN;
    END IF;

    IF i_accessdate IS NULL THEN
        errmsg := 'アクセス日が指定されていません。';
        errcd := -10;
        RETURN;
    END IF;

    IF i_updusrnm IS NULL THEN
        errmsg := '更新ユーザ名が指定されていません。';
        errcd := -10;
        RETURN;
    END IF;

    IF i_updpcnm IS NULL THEN
        errmsg := '更新マシンが指定されていません。';
        errcd := -10;
        RETURN;
    END IF;

 -- 外部キーチェック --
    SELECT itemcd INTO cntcheck FROM t_item_basic_attr WHERE itemcd = i_itemcd;
    IF  NOT FOUND THEN
        errmsg := '品目基本属性テーブルに存在しない品目コード';
        errcd := -10;
        RETURN;
    END IF;

 -- IPアドレスチェック --
    SELECT itemcd INTO cntcheck FROM t_access WHERE itemcd = i_itemcd AND accessdate = i_accessdate AND updpcnm = i_updpcnm;
    IF FOUND THEN
        errmsg := '前回とipアドレスが同一のため更新しない';
        errcd := 1;
        RETURN;
    END IF;

 -- 更新処理 --
    SELECT refercount INTO cntcheck FROM t_access WHERE itemcd = i_itemcd AND accessdate = i_accessdate;
    IF  NOT FOUND THEN
        INSERT INTO t_access(itemcd, accessdate, refercount, updusrnm, updpcnm)VALUES(i_itemcd, i_accessdate, 1, i_updusrnm, i_updpcnm);
        errcd := 1;
        RETURN;
    ELSE
        UPDATE t_access set refercount = cntcheck+1, updusrnm = i_updusrnm, updpcnm = i_updpcnm WHERE itemcd = i_itemcd AND accessdate = i_accessdate;
        errcd := 1;
        RETURN;
    END IF;
END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;