私は Oracle を初めて使用し、テーブルの追加/挿入ストアド プロシージャを作成しようとしています。テーブルの PROD_CD フィールドと PLAN_CD フィールドに値を指定できません (空または null) コードを確認して、どこが間違っているのか教えてください。
テーブル定義:
CREATE TABLE DCWEB.USER_PLAN_PREFERENCE
(
USERID VARCHAR2(40) NOT NULL,
PROD_CD VARCHAR2(9) NULL,
PLAN_CD VARCHAR2(9) NULL,
STATE_LST VARCHAR2(2) NOT NULL,
STATE_NM VARCHAR2(40) NOT NULL,
LST_UPDATE_TS TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL
);
ALTER TABLE DCWEB.USER_PLAN_PREFERENCE
ADD CONSTRAINT USER_PLAN_PREFERENCE_XPK PRIMARY KEY (USERID, PROD_CD, PLAN_CD);
-- Grant/Revoke object privileges
grant select, insert, update, delete on DCWEB.USER_PLAN_PREFERENCE to HIGGIB1;
ストアド プロシージャの定義:
procedure setUserPlanPref (
userid in varchar2,
prod_cd in varchar2,
plan_cd in varchar2,
state_lst in varchar2,
state_nm in varchar2
)
is
currentTimestamp timestamp := current_timestamp;
begin
insert into user_plan_preference (userid, prod_cd, plan_cd, state_lst, state_nm, lst_update_ts)
values (upper(userid), upper(prod_cd), upper(plan_cd), upper(state_lst), upper(state_nm), currentTimestamp);
commit;
exception
when dup_val_on_index then
begin
update user_plan_preference up set
up.userid = upper(userid),
up.prod_cd = upper(prod_cd),
up.plan_cd = upper(plan_cd),
up.state_lst = upper(state_lst),
up.state_nm = upper(state_nm),
up.lst_update_ts = currentTimestamp
where up.userid = upper(userid)
and up.prod_cd = upper(prod_cd)
and up.plan_cd = upper(plan_cd);
commit;
exception
when others then
rollback;
end;
when others then
rollback;
end;
end;
入力データ
次の値を持つストアド プロシージャを呼び出すレコードを挿入できません: DCWEB4578, , 2P, CA, CALIFORNIA しかし、文字列 "NULL" に変更すると、挿入は成功します。ストアド プロシージャを呼び出して、挿入されたレコードを次の値で更新しようとすると、DCWEB4578、"NULL"、2P、CO、COLORODO という値がテーブルに表示されるため、更新は行われません。