0

ユーザーに入力を求め、テーブルを保存/更新するストアド プロシージャがあります。私の問題は、番号を入力するときに制限を追加しようとすると、計画どおりに機能しないことです。

ここに表があります:

       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;

それは機能せず、最初のものだけに従います。どうすればこれを克服できますか?前もって感謝します。助けていただければ幸いです。

4

1 に答える 1

1

あなたの状態は間違っていると思います:

IF V_PP_ID = 'PP03' OR V_INC_I_POINTS > 10 OR V_INC_I_POINTS < 10 THENV_PP_IDが「PP03」に等しい場合 (V_INC_I_POINTS の値に関係なく)、およびV_INC_I_POINTSが 10 に等しくない場合 ( V_PP_ID の値に関係なく) は常に true と評価されます。

意図した条件は次のとおりだと思います。

IF V_PP_ID = 'PP03' AND (V_INC_I_POINTS > 10 OR V_INC_I_POINTS < 10) THEN

または単に:

IF V_PP_ID = 'PP03' AND V_INC_I_POINTS != 10 THEN

(「PP02」と「PP01」に関する残りの条件は、それに応じて変更する必要があります。)

編集:

最初は見落としていましたが、「V_PP_ID」には絶対に値が設定されていないようです。選択した行のPP_ID列の値にインスタンス化する必要があります。

置き換えてみてください:

SELECT I_POINTS INTO v_I_POINTS 
    FROM incident WHERE icd_id = v_icd_id;

SELECT I_POINTS, PP_ID INTO v_I_POINTS, V_PP_ID 
    FROM incident WHERE icd_id = v_icd_id;
于 2013-05-04T12:42:49.313 に答える