--
-- Function: f_ex_stock_detail_update_rackid
--      棚番IDのみ変更SP

DROP FUNCTION f_ex_stock_detail_update_rackid(
    IN i_itemcd integer,       -- 商品C
    IN i_structcd integer,     -- 構成C
    IN i_stockcd integer,      -- 在庫C
    IN i_rackid varchar,       -- 棚番ID

    IN i_updusrnm varchar,
    IN i_updpcnm varchar,
    IN i_updcnt integer,


    OUT errcd integer,
    OUT errmsg varchar,
    OUT code  integer);

CREATE OR REPLACE FUNCTION f_ex_stock_detail_update_rackid(
    IN i_itemcd integer,       -- 商品C
    IN i_structcd integer,     -- 構成C
    IN i_stockcd integer,      -- 在庫C
    IN i_rackid varchar,       -- 棚番ID

    IN i_updusrnm varchar,
    IN i_updpcnm varchar,
    IN i_updcnt integer,


    OUT errcd integer,
    OUT errmsg varchar,
    OUT code  integer) AS
$BODY$

DECLARE
    i integer;
    cntcheck integer;
    idcheck varchar;
BEGIN

    -- 必須チェック
    IF i_itemcd IS NULL THEN
        RAISE EXCEPTION '品目コードが指定されていません';
    END IF;
    IF i_structcd IS NULL THEN
        RAISE EXCEPTION '構成コードが指定されていません';
    END IF;
    IF i_stockcd 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;

    -- 存在チェック
    SELECT stockcd INTO cntcheck FROM t_ex_stock_detail WHERE itemcd = i_itemcd AND structcd = i_structcd AND stockcd = i_stockcd;
    IF cntcheck IS NULL THEN
        RAISE EXCEPTION 'レコードが存在しません';
    END IF;

    -- 重複チェック
    SELECT COUNT(rackid) INTO cntcheck FROM t_ex_stock_detail WHERE stockstate = 3 AND rackid = i_rackid AND delflg = FALSE;
    IF cntcheck = 1 THEN
        SELECT rackid INTO idcheck FROM t_ex_stock_detail WHERE itemcd = i_itemcd AND structcd = i_structcd AND stockcd = i_stockcd AND stockstate = 3 AND rackid = i_rackid;
        IF idcheck IS NOT NULL THEN
            -- 変更ナシ
            errcd := 1;
            RETURN;
        ELSE
            errcd := -10;
            errmsg := '指定された棚番 ID は割り当て済みです';
            RETURN;
        END IF;
    ELSEIF cntcheck > 1 THEN
        errcd := -10;
        errmsg := '重複する棚番 ID が存在します';
        RETURN;
    END IF;

    -- 更新カウンタチェック
    SELECT updcnt INTO cntcheck FROM t_ex_stock_detail WHERE itemcd = i_itemcd AND structcd = i_structcd AND stockcd = i_stockcd;
    IF NOT FOUND OR cntcheck <> i_updcnt THEN
        errcd := -10;
        errmsg := '変更中に更新が行われたか、二重更新です';
        RETURN;
    END IF;

    --  更新処理 --
    UPDATE t_ex_stock_detail SET
        rackid = i_rackid,

        updusrnm = i_updusrnm,
        updpcnm = i_updpcnm
         WHERE itemcd = i_itemcd AND structcd = i_structcd AND stockcd = i_stockcd;

    errcd := 1;
    RETURN;
END;

$BODY$
    LANGUAGE 'plpgsql' VOLATILE;