CREATE OR REPLACE FUNCTION f_dl_order_update(
    IN kubun             integer,   -- 区分

    IN _orderno          integer,   -- 受注No
    IN _orderrowno       integer,   -- 受注行No
    IN _membercd        integer,   -- 会員C
    IN _dlcount             integer,      -- ダウンロード回数
    IN _dlperiodend     date,   -- ダウンロード期間

    IN usr               varchar,   -- 更新ユーザ
    IN pc                varchar,   -- 更新マシン
 
    OUT errcd            integer,
    OUT errmsg           varchar,
    OUT code             integer) AS
$$
DECLARE
    rec      RECORD;
    cntcheck integer;
    i integer;
BEGIN
    --
    -- パラメータチェック
    --

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


    IF kubun IN (1,2,3) THEN
        IF _orderno IS NULL THEN
            RAISE EXCEPTION '受注NOは必須です';
        END IF;
        IF _orderrowno IS NULL THEN
            RAISE EXCEPTION '受注明細NOは必須です';
        END IF;
        IF s_check_upd(usr, pc) = FALSE THEN
            RAISE EXCEPTION '引数 usr&pc が不正です';
        END IF;
    END IF;

    IF kubun IN (1,2) THEN
        IF _membercd IS NULL THEN
            RAISE EXCEPTION '会員コードは必須です';
        END IF;
    END IF;

    IF kubun IN (1,2) THEN
        IF _dlcount IS NULL THEN
            RAISE EXCEPTION 'ダウンロード回数は必須です';
        END IF;
    END IF;

    IF kubun IN (1,2) THEN
        IF _dlperiodend IS NULL THEN
            RAISE EXCEPTION 'ダウンロード期間は必須です';
        END IF;
    END IF;

    -- 存在チェック
    IF kubun = 2 THEN
        SELECT orderno INTO cntcheck FROM t_order_title WHERE orderno = _orderno;
        IF NOT FOUND THEN
            RAISE EXCEPTION '引数 orderno がt_order_titleに存在しません';
        END IF;
        IF _orderrowno IS NOT NULL THEN
            SELECT orderrowno INTO cntcheck FROM t_order_detail WHERE orderno = _orderno AND orderrowno = _orderrowno;
            IF NOT FOUND THEN
                RAISE EXCEPTION '引数 orderrowno がt_order_detailに存在しません';
            END IF;
        END IF;
    END IF;




    ---- 処理
    -- 追加
    IF kubun = 1 THEN
        INSERT INTO t_dl_order (orderno, orderrowno, membercd, maxdlcount, dlperiodend,  updusrnm, updpcnm)
                    VALUES(_orderno, _orderrowno, _membercd, _dlcount, _dlperiodend, usr, pc);
            errcd := 1;
            errmsg := '追加';

    -- 更新
    ELSIF kubun = 2 THEN

        -- 受注NO と 受注行NOで検索
        SELECT orderrowno INTO cntcheck FROM t_dl_order WHERE orderno = _orderno AND orderrowno = _orderrowno;

        UPDATE t_dl_order SET
            membercd = _membercd,
            maxdlcount = _dlcount,
            dlperiodend = _dlperiodend,

            updusrnm = usr,
            updpcnm = pc
             WHERE orderno = _orderno AND orderrowno = _orderrowno;
        errcd := 1;
        errmsg := '更新';

    -- 削除
    ELSIF kubun = 3 THEN

        SELECT orderrowno INTO cntcheck FROM t_dl_order WHERE orderno = _orderno AND orderrowno = _orderrowno;
        UPDATE t_dl_order SET
            delflg = TRUE,
            updusrnm = usr,
            updpcnm = pc
            WHERE orderno = _orderno AND orderrowno = _orderrowno;

        errcd := 1;
        code := _orderno;
        errmsg := '削除';

    END IF;

    RETURN ;
END;
$$
LANGUAGE 'plpgsql' VOLATILE;
