-- 会員基本属性テーブル 変更
CREATE OR REPLACE FUNCTION f_member_basic_attr_update(IN integer, IN integer, IN integer, IN varchar, IN varchar, IN varchar, IN varchar, IN varchar, IN varchar, IN varchar, IN varchar, IN integer, IN varchar, IN date, IN integer, IN varchar, IN integer, IN integer, IN date, IN varchar, IN varchar, IN integer, OUT errcd integer,  OUT errmsg character varying,  OUT code integer) AS
$BODY$

DECLARE
    kubun ALIAS FOR $1;               -- 区分
    i_membercd ALIAS FOR $2;          -- 会員C
    i_memberdiv ALIAS FOR $3;         -- 会員区分
    i_lastnm ALIAS FOR $4;            -- 姓
    i_firstnm  ALIAS FOR $5;          -- 名
    i_lastnmkana ALIAS FOR $6;        -- 姓（かな）
    i_firstnmkana ALIAS FOR $7;       -- 名（かな）
    i_mailaddr ALIAS FOR $8;          -- メールアドレス
    i_mobmailaddr ALIAS FOR $9;       -- 携帯電話メールアドレス
    i_password ALIAS FOR $10;          -- パスワード
    i_nicknm ALIAS FOR $11;           -- ニックネーム
    i_secquestioncd ALIAS FOR $12;    -- 秘密の質問C
    i_secquestionans ALIAS FOR $13;   -- 秘密の質問の答え
    i_birthdate ALIAS FOR $14;        -- 数値生年月日
    i_sex ALIAS FOR $15;              -- 性別
    i_selfintro ALIAS FOR $16;        -- 自己紹介
    i_memberstate ALIAS FOR $17;      -- 会員状態
    i_maildiv ALIAS FOR $18;          -- メール区分
    i_registdate ALIAS FOR $19;       -- 登録日
    i_updusrnm ALIAS FOR $20;         -- 更新ユーザ名
    i_updpcnm ALIAS FOR $21;          -- 更新マシン名
    i_updcnt ALIAS FOR $22;           -- 更新カウンタ

    sql1 varchar;

    cntcheck integer;
    makerc integer;
    labelc integer;
    MES_001 varchar := '会員コード' || i_membercd || 'は登録済みです';
    MES_002 varchar := '品名が指定されていません';
BEGIN



-- 必須チェック --
--SELECT itemcd INTO cntcheck FROM t_item_basic_attr WHERE itemcd = itemcode AND structcd = structcode;

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

    IF kubun IN (2,3) THEN
        IF i_membercd IS NULL THEN
            RAISE EXCEPTION '会員コードの引数は必須です';
        END IF;
        IF i_updcnt IS NULL THEN
            RAISE EXCEPTION '更新カウンタの引数は必須です';
        END IF;

    END IF;

    IF kubun IN (1) THEN
        IF i_lastnm IS NULL THEN
            RAISE EXCEPTION '姓の引数は必須です';
        END IF;
        IF i_firstnm IS NULL THEN
            RAISE EXCEPTION '名の引数は必須です';
        END IF;
        IF i_lastnmkana IS NULL THEN
            RAISE EXCEPTION '姓(かな)の引数は必須です';
        END IF;
        IF i_firstnmkana IS NULL THEN
            RAISE EXCEPTION '名(かな)の引数は必須です';
        END IF;
        IF i_mailaddr IS NULL THEN
            RAISE EXCEPTION 'メールアドレスの引数は必須です';
        END IF;
        IF i_password IS NULL THEN
            RAISE EXCEPTION 'パスワードの引数は必須です';
        END IF;
        IF i_secquestioncd IS NULL THEN
            RAISE EXCEPTION '秘密の質問コードの引数は必須です';
        END IF;
        IF i_secquestionans IS NULL THEN
            RAISE EXCEPTION '秘密の質問の答えの引数は必須です';
        END IF;
        IF i_sex IS NULL THEN
            RAISE EXCEPTION '性別の引数は必須です';
        END IF;
        IF i_memberstate IS NULL THEN
            RAISE EXCEPTION '会員状態の引数は必須です';
        END IF;
        IF i_registdate 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 membercd INTO cntcheck FROM t_member_basic_attr WHERE membercd = i_membercd;
          IF NOT FOUND THEN
            RAISE EXCEPTION 'その会員コードのレコードは存在しません';
        END IF;
    END IF;

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

 ---  更新処理 ---


    -- 追加
    IF kubun = 1 THEN
        INSERT INTO t_member_basic_attr(
            memberdiv, lastnm,   firstnm,   lastnmkana,   firstnmkana,   mailaddr,   mobmailaddr,   password,   nicknm,   secquestioncd,   secquestionans,   birthdate,   sex,  selfintro,   memberstate,   maildiv,   registdate,   updusrnm,   updpcnm)
        VALUES(
            i_memberdiv, i_lastnm, i_firstnm, i_lastnmkana, i_firstnmkana, i_mailaddr, i_mobmailaddr, i_password, i_nicknm, i_secquestioncd, i_secquestionans, i_birthdate, i_sex, i_selfintro, i_memberstate, i_maildiv, i_registdate, i_updusrnm, i_updpcnm
        );
        errcd := 1;
        code := lastval();
        RETURN;

    -- 変更
    ELSIF kubun = 2 THEN
        UPDATE t_member_basic_attr SET
            memberdiv= i_memberdiv,
            lastnm= i_lastnm,
            firstnm= i_firstnm,
            lastnmkana= i_lastnmkana,
            firstnmkana= i_firstnmkana,
            mailaddr= i_mailaddr,
            mobmailaddr= i_mobmailaddr,
            password= i_password,
            nicknm= i_nicknm,
            secquestioncd= i_secquestioncd,
            secquestionans= i_secquestionans,
            birthdate= i_birthdate,
            sex = i_sex,
            selfintro= i_selfintro,
            memberstate= i_memberstate,
            maildiv= i_maildiv,
            updusrnm = i_updusrnm,
            updpcnm= i_updpcnm
        WHERE membercd= i_membercd;

        errcd := 1;
        code := i_membercd;
        RETURN;

    -- 削除
    ELSIF kubun =3 THEN
        UPDATE t_member_basic_attr
           SET delflg   = TRUE,
               updusrnm = i_updusrnm,
               updpcnm  = i_updpcnm
           WHERE membercd = i_membercd;

        errcd := 1;
        code := i_membercd;

        RETURN;
    END IF;
END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

