2013-05-04 69 views
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; 
/

我试图做到:

是为了防止人们进入超过10值少于10个,其​​中PP_ID是 “PP03” 。

为此,我申请:

IF V_PP_ID = 'PP03' OR V_INC_I_POINTS > 10 OR V_INC_I_POINTS < 10 THEN 
    RAISE E_A; 
    END IF; 

这工作正常,但是当我添加其他限制,如:

为了防止别人进入的超过5和小于5,其中值PP_ID是“PP02”。

IF V_PP_ID = 'PP02' OR V_INC_I_POINTS > 5 OR V_INC_I_POINTS < 5 THEN 
    RAISE E_B; 
    END IF; 

OR

为了防止人们进入一个大于1且小于1,其中PP_ID是 “PP01” 的价值观。

IF V_PP_ID = 'PP01' OR V_INC_I_POINTS > 1 OR V_INC_I_POINTS < 1 THEN 
    RAISE E_C; 
    END IF; 

它不起作用,只跟在第一个。我该如何克服这一点? 提前致谢。非常感谢帮助。

+1

你有没有考虑实施这些限制,(域)的约束? – wildplasser 2013-05-04 12:05:17

+0

我确实是这样,但我认为这会很麻烦,并决定在程序中加入限制。 – Ryoss 2013-05-04 12:31:09

回答

1

我觉得你的条件是不正确的:

IF V_PP_ID = 'PP03' OR V_INC_I_POINTS > 10 OR V_INC_I_POINTS < 10 THEN的值为true时V_PP_ID等于“PP03”(无论V_INC_I_POINTS的值),每当V_INC_I_POINTS不等于10(无论V_PP_ID的值)。

我相信预期coniditon是:

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; 
+0

感谢您的尝试,尽管它没有改变我最初的结果(尝试了两条建议)。 – Ryoss 2013-05-04 13:13:17

+0

您能提供一些结果吗?使用以下输入组合:v_icd_id = ICD03,v_inc_I_POINTS = {9,10,11} | v_icd_id = ICD02,v_inc_I_POINTS = {4,5,11} | v_icd_id = ICD01,v_inc_I_POINTS = {0,1,6} – gkalpak 2013-05-04 15:39:05

+0

尝试使用您提供的数据输入您的两个示例。虽然它没有任何限制地更新点。 – Ryoss 2013-05-05 10:49:33

相关问题