-- キャストテーブル更新
-- DROP FUNCTION f_cast_update(kubun int4, code int4, shopdiv int4, name "varchar", kana "varchar", cstdv int4, recdv int4, comm "varchar", ddte "varchar", bplc int4, bdte "varchar", usr "varchar", pc "varchar", count int4);


CREATE OR REPLACE FUNCTION f_cast_update(
    kubun       int4,       -- 処理区分
    code        int4,       -- キャストコード
    shopdv     int4,
    name        "varchar",  -- キャスト名
    kana        "varchar",  -- キャストかな
    cstdv       int4,       -- キャスト種別
    recdv       int4,       -- おすすめ区分
    comm        "varchar",  -- コメント
    ddte        "varchar",  -- デビュー年月
    bplc        int4,       -- 出身
    bdte        "varchar",  -- 生年月日
    usr         "varchar",  -- 更新ユーザ
    pc          "varchar",  -- 更新PC
    count       int4)       -- 更新カウンタ

RETURNS int4 AS
$$
DECLARE
    cntcheck integer;
BEGIN
    --
    -- パラメータチェック
    --

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

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

    -- 必須チェック
    IF kubun IN (1,2) THEN
        IF cstdv IS NULL THEN
            RAISE EXCEPTION '引数 cstdv は必須です';
        END IF;
        IF recdv IS NULL THEN
            RAISE EXCEPTION '引数 recdv は必須です';
        END IF;
    END IF;
    IF kubun IN (2,3) THEN
        IF code IS NULL THEN
            RAISE EXCEPTION '引数 code は必須です';
        END IF;
        IF count IS NULL THEN
            RAISE EXCEPTION '引数 count は必須です';
        END IF;
    END IF;

    -- 桁数チェック
    IF kubun IN (1,2) THEN
        IF s_check_length(name, 256) = FALSE THEN
            RAISE EXCEPTION '引数 name が不正です';
        END IF;
        IF s_check_length(kana, 256) = FALSE THEN
            RAISE EXCEPTION '引数 kana が不正です';
        END IF;
        IF s_check_length(comm, 1024) = FALSE THEN
            RAISE EXCEPTION '引数 comm が不正です';
        END IF;
        IF s_check_length(ddte, 256) = FALSE THEN
            RAISE EXCEPTION '引数 ddte が不正です';
        END IF;
        IF s_check_length(bdte, 256) = FALSE THEN
            RAISE EXCEPTION '引数 bdte が不正です';
        END IF;
    END IF;
    IF kubun IN (1,2,3) THEN
        IF s_check_upd(usr, pc) = FALSE THEN
            RAISE EXCEPTION '引数 usr&pc が不正です';
        END IF;
    END IF;

    -- 存在チェック
    IF kubun IN (1,2) AND bplc <> 0  THEN
        SELECT prefcd INTO cntcheck FROM t_pref WHERE prefcd = bplc;
          IF NOT FOUND THEN
            RAISE EXCEPTION '引数 bplc が存在しません';
        END IF;
    END IF;

    -- キャスト品目チェック
    IF kubun IN (3) THEN
        SELECT itemcd INTO cntcheck FROM t_cast_item WHERE castcd = code AND delflg = false;
        IF FOUND THEN
            RETURN -10;
        END IF;
    END IF;

    -- 更新カウンタチェック
    IF kubun IN (2,3) THEN
        SELECT updcnt INTO cntcheck FROM t_cast WHERE castcd = code;
          IF NOT FOUND OR cntcheck <> count THEN
            RETURN -11;
        END IF;
    END IF;

    --
    -- 更新処理
    --

    -- 追加
    IF kubun = 1 THEN
        INSERT INTO t_cast(castnm, castnmkana, castdiv, recommenddiv, comment, debutdate, birthplacecd, birthdate, shopdiv, updusrnm, updpcnm)
               VALUES(name, kana, cstdv, recdv, comm, ddte, bplc, bdte, shopdv, usr, pc);

    -- 更新
    ELSIF kubun = 2 THEN
        UPDATE t_cast
           SET castnm       = name,
               castnmkana   = kana,
               castdiv      = cstdv,
               recommenddiv = recdv,
               comment      = comm,
               debutdate    = ddte,
               birthplacecd = bplc,
               birthdate    = bdte,
               updusrnm     = usr,
               updpcnm      = pc
         WHERE castcd = code AND shopdiv = shopdv;

    -- 削除
    ELSIF kubun = 3 THEN
        UPDATE t_cast
           SET delflg   = TRUE,
               updusrnm = usr,
               updpcnm  = pc
         WHERE castcd = code AND shopdiv = shopdv;
    END IF;

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