2016-11-10 37 views
0

我正在嘗試使用Oracle數據庫上的更新編寫一個存儲過程,我希望'labelcount'增加1。在Oracle數據庫上更新列的增量值

MEMBER_NUM字段不允許有兩次相同的值。

有什麼建議嗎?

labelcount:= 1 


IF (major_count >=1) and (min_count >=1) then 
      UPDATE TBL_MEMBERS 
      SET  MEMBER_NUM = Major || 'M' || labelcount 
      WHERE MEMBER_ID = Minor and MEMBER_NUM = 'XXX'; 

End If; 

所以這個:

Member_ID | Member_NUM | 
A  | xxx  | 
A  | 4444  | 
A  | xxx  | 
A  | xxx  | 

變爲

Member_ID | Member_NUM | 
A  | AM1  | 
A  | 4444  | 
A  | AM2  | 
A  | AM3  | 
+2

對不起,我不明白。你可以添加幾個例子嗎? – Mat

+2

使用系統生成的序列,不要試圖手動完成。 (如果你有兩個用戶試圖在不同的會話中做同樣的更新,它會如何工作?) – mathguy

+0

我發佈了一個簡單的答案,儘管IMO涵蓋了你的描述。如果你期望有不同的邏輯,請重新制定你的要求:) –

回答

1

不太肯定我理解你的要求,由於對Member_Num列了「4444」的價值,但我想給它一個鏡頭:

DDL:

Create Table TBL_MEMBERS 
(
    Member_ID  number 
    , Member_NUM  varchar2(100) 
); 

create sequence labelcount 
start with 1; 

CREATE or replace PROCEDURE INC_LABEL_COUNT (P_major_count NUMBER, p_min_count NUMBER) 
AS 

    L_STAGE VARCHAR2(100); 

BEGIN 

    L_STAGE := 'Checking for Count Values'; 

    IF (p_major_count >=1) and (p_min_count >=1) then 

      UPDATE TBL_MEMBERS 
      SET  MEMBER_NUM = 'Major' || 'M' || labelcount.nextval 
      WHERE MEMBER_ID = 'Minor'    
      and  MEMBER_NUM = 'XXX'; 

    End If; 


EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line('Error in Stage: '||L_STAGE||' '||sqlerrm);   
END INC_LABEL_COUNT;  

這是據我可以走了,因爲這是我的唯一信息。

你能提供更多嗎?

1

你是不是非常精確,所以答案不能準確以及

爲了避免重複在MEMBER_NUM列中使用唯一索引。

如果增加的數字已經存在於數據庫中,則更新將因此失敗。

最好使用explicite列minorlablecount(不是字符串連接)

1

一是一些行構建示例

-- Example Table 
CREATE TABLE TBL_MEMBERS 
( 
    MEMBER_ID CHAR(1), 
    MEMBER_NUM CHAR(5) 
) 
/
-- Example Data 
delete from TBL_MEMBERS; 
INSERT INTO TBL_MEMBERS (
    SELECT 'A','xxx' FROM DUAL UNION ALL 
    SELECT 'A','xxx' FROM DUAL UNION ALL 
    SELECT 'A','xxx' FROM DUAL UNION ALL 
    SELECT 'A','1234' FROM DUAL UNION ALL 
    SELECT 'A','xxx' FROM DUAL UNION ALL 
    SELECT 'A','5678' FROM DUAL 
) 
/

數據:

MEMBER_ID|MEMBER_NUM 
A  |xxx 
A  |xxx 
A  |xxx 
A  |1234 
A  |xxx 
A  |5678 

-- This is the way you should use 
--DROP sequence AI_MEMBERS; 
CREATE SEQUENCE AI_MEMBERS; 
-- Here you can try it out, but attention 
-- each select increases the number 
SELECT AI_MEMBERS.NEXTVAL FROM DUAL; 

-- Your update (without your minor/major ..., cause it is unimportant for explanation 
UPDATE TBL_MEMBERS 
SET  MEMBER_NUM = 'A' || 'M' || AI_MEMBERS.NEXTVAL 
WHERE MEMBER_ID = 'A' and MEMBER_NUM = 'XXX' 
; 

結果:

MEMBER_ID|MEMBER_NUM 
A  |AM1 
A  |AM2 
A  |AM3 
A  |1234 
A  |AM4 
A  |5678