CREATE OR REPLACE FUNCTION f_news_update(
    IN integer,
    IN integer,
    IN date,
    IN character varying,
    IN character varying,
    IN integer,

    IN character varying,
    IN character varying,
    IN integer,

    OUT errcd integer,
    OUT errmsg character varying,
    OUT code integer) AS
$$

DECLARE
    kubun ALIAS FOR $1;             -- 処理区分
    i_newscd ALIAS FOR $2;          -- ニュースコード
    i_date ALIAS FOR $3;            -- お知らせ日
    i_title ALIAS FOR $4;           -- タイトル
    i_body ALIAS FOR $5;            -- 本文
    i_releasediv ALIAS FOR $6;      -- 公開区分

    i_updusrnm ALIAS FOR $7;        -- 更新ユーザ
    i_updpcnm ALIAS FOR $8;         -- 更新マシン(IPアドレス)
    i_updcnt ALIAS FOR $9;

    cntcheck integer;
    nowdate timestamp;
    newupdcnt integer;

BEGIN

-- 必須チェック
    IF kubun IS NULL OR kubun NOT IN (1,2,3) THEN
        RAISE EXCEPTION '処理区分が不正です';
    END IF;

    IF kubun IN (2,3) THEN
        IF i_newscd IS NULL THEN
            RAISE EXCEPTION 'ニュースコードの引数は必須です';
        END IF;

        IF i_updcnt IS NULL THEN
            RAISE EXCEPTION '更新カウンタの引数は必須です';
        END IF;
    END IF;
    IF kubun IN (1,2) THEN

        IF i_date IS NULL THEN
            RAISE EXCEPTION '公開日の引数は必須です';
        END IF;
        IF i_title IS NULL THEN
            RAISE EXCEPTION 'タイトルの引数は必須です';
        END IF;
        IF i_body IS NULL THEN
            RAISE EXCEPTION '本文の引数は必須です';
        END IF;
        IF i_releasediv IS NULL THEN
            RAISE EXCEPTION '公開区分の引数は必須です';
        END IF;

        IF i_updusrnm IS NULL THEN
            RAISE EXCEPTION '更新ユーザーの引数は必須です';
        END IF;

        IF i_updpcnm IS NULL THEN
            RAISE EXCEPTION '更新マシンの引数は必須です';
        END IF;
    END IF;

    -- 存在チェック
    IF kubun IN (2,3) THEN
        SELECT newscd INTO cntcheck FROM t_news WHERE newscd = i_newscd;
          IF NOT FOUND THEN
            RAISE EXCEPTION 'ニュースコードは存在しません';
        END IF;
    END IF;

    -- 更新カウンタチェック
    IF kubun IN (2,3) THEN
        SELECT updcnt INTO cntcheck FROM t_news WHERE newscd = i_newscd;
          IF NOT FOUND OR cntcheck <> i_updcnt THEN
            errcd := -11;
            errmsg := '更新カウンタが不正';
            RETURN;
          END IF;
    END IF;


    --- 更新処理 ---


    nowdate := 'now';              -- 現在の日時を取得
    IF kubun IN (2,3) THEN
        newupdcnt := i_updcnt+1;   -- 更新カウントを進める
    END IF;

    -- 追加
    IF kubun = 1 THEN
        INSERT INTO t_news (
            date,
            title,
            body,
            releasediv,
            delflg,
            adddate,
            upddate,
            updusrnm,
            updpcnm,
            updcnt)
        VALUES(
            i_date,
            i_title,
            i_body,
            i_releasediv,
            FALSE,
            nowdate,
            nowdate,
            i_updusrnm,
            i_updpcnm,
            0);

    -- æ›´æ–°
    ELSIF kubun = 2 THEN
        UPDATE t_news SET
            date       = i_date,
            title      = i_title,
            body       = i_body,
            releasediv = i_releasediv,
            upddate    = nowdate,
            updusrnm   = i_updusrnm,
            updpcnm    = i_updusrnm,
            updcnt     = newupdcnt
            WHERE newscd = i_newscd;

    -- 削除
    ELSIF kubun = 3 THEN
        UPDATE t_news SET
            delflg = TRUE,
            upddate  = nowdate,
            updusrnm = i_updusrnm,
            updpcnm  = i_updpcnm,
            updcnt   = newupdcnt
        WHERE newscd = i_newscd;
    END IF;

    code := 1;
END;
$$
LANGUAGE 'plpgsql' VOLATILE;