ユーザーに入力を求め、テーブルを保存/更新するストアド プロシージャがあります。私の問題は、番号を入力するときに制限を追加しようとすると、計画どおりに機能しないことです。
ここに表があります:
Drop table incident;
CREATE TABLE INCIDENT
(ICD_ID VARCHAR2 (8) NOT NULL PRIMARY KEY,
PLR_ID VARCHAR2 (11),
M_ID VARCHAR2 (10),
PP_ID VARCHAR2 (10),
I_POINTS NUMBER (8));
INSERT INTO INCIDENT VALUES
('ICD01', 'CHE01', 'M01', 'PP01', NULL);
INSERT INTO INCIDENT VALUES
('ICD02', 'CHE03', 'M07', 'PP02', NULL);
INSERT INTO INCIDENT VALUES
('ICD03', 'CHE03', 'M04', 'PP03', NULL);
INSERT INTO INCIDENT VALUES
('ICD04', 'KLN04', 'M07', 'PP02', NULL);
INSERT INTO INCIDENT VALUES
('ICD05', 'CHE01', 'M04', 'PP03', NULL);
プロンプトが表示されたら、ICD_ID (たとえば、'ICD03')を入力します*大文字にする必要があります* エントリ。
手順:
DECLARE
v_icd_id incident.icd_id%type := &INCIDENT_ID;
v_inc_I_POINTS incident.i_points%type := &PENALTY_POINTS;
v_I_POINTS incident.I_POINTS%type;
V_PP_ID INCIDENT.PP_ID%TYPE;
E_TOO_MANY_POINTS exception;
E_UPDATE_HIGH exception;
E_A exception;
E_B exception;
E_C exception;
BEGIN
SELECT I_POINTS INTO v_I_POINTS
FROM incident WHERE icd_id = v_icd_id;
IF v_I_POINTS > 10 THEN
RAISE E_UPDATE_HIGH;
END IF;
IF v_inc_I_POINTS >10 THEN
RAISE E_TOO_MANY_POINTS;
END IF;
IF V_PP_ID = 'PP03' OR V_INC_I_POINTS > 10 OR V_INC_I_POINTS < 10 THEN
RAISE E_A;
END IF;
UPDATE incident SET i_points = (v_inc_i_points + NVL(i_points,0))
WHERE icd_id=v_icd_id;
DBMS_OUTPUT.PUT_LINE('');
DBMS_OUTPUT.PUT_LINE('=====================');
DBMS_OUTPUT.PUT_LINE('PENALTY POINTS UPDATED!');
DBMS_OUTPUT.PUT_LINE('=====================');
DBMS_OUTPUT.PUT_LINE('');
EXCEPTION
WHEN E_TOO_MANY_POINTS THEN
DBMS_OUTPUT.PUT_LINE('==========================================================');
DBMS_OUTPUT.PUT_LINE('TOO MANY POINTS ALLOCATED THERE! ACTION ABORTED.');
DBMS_OUTPUT.PUT_LINE('==========================================================');
WHEN E_UPDATE_HIGH THEN
DBMS_OUTPUT.PUT_LINE('=============================================================');
DBMS_OUTPUT.PUT_LINE('CAN NOT STORE THAT MANY PENALTY POINTS THERE! ACTION ABORTED.');
DBMS_OUTPUT.PUT_LINE('=============================================================');
WHEN E_A THEN
DBMS_OUTPUT.PUT_LINE('=============================================================');
DBMS_OUTPUT.PUT_LINE('CAN ONLY ALLOCATED 10 POINTS HERE! ACTION ABORTED.');
DBMS_OUTPUT.PUT_LINE('=============================================================');
WHEN E_B THEN
DBMS_OUTPUT.PUT_LINE('=============================================================');
DBMS_OUTPUT.PUT_LINE('CAN ONLY ALLOCATED 5 POINTS HERE! ACTION ABORTED.');
DBMS_OUTPUT.PUT_LINE('=============================================================');
WHEN E_C THEN
DBMS_OUTPUT.PUT_LINE('=============================================================');
DBMS_OUTPUT.PUT_LINE('CAN ONLY ALLOCATED 1 POINTS HERE! ACTION ABORTED.');
DBMS_OUTPUT.PUT_LINE('=============================================================');
END;
/
私が達成しようとしていること:
PP_ID が「PP03」の場合、10 を超えて 10 未満の値を入力できないようにするためです。
このために私は適用しました:
IF V_PP_ID = 'PP03' OR V_INC_I_POINTS > 10 OR V_INC_I_POINTS < 10 THEN
RAISE E_A;
END IF;
それはうまくいきますが、次のような別の制限を追加すると:
PP_ID が「PP02」の場合に、5 を超えて 5 未満の値を入力できないようにします。
IF V_PP_ID = 'PP02' OR V_INC_I_POINTS > 5 OR V_INC_I_POINTS < 5 THEN
RAISE E_B;
END IF;
また
PP_ID が「PP01」の場合、1 より大きく 1 より小さい値を入力できないようにします。
IF V_PP_ID = 'PP01' OR V_INC_I_POINTS > 1 OR V_INC_I_POINTS < 1 THEN
RAISE E_C;
END IF;
それは機能せず、最初のものだけに従います。どうすればこれを克服できますか?前もって感謝します。助けていただければ幸いです。