Db2存储过程增加某个唯一组合的列值

时间:2018-01-23 21:56:36

标签: sql stored-procedures db2

Db2存储过程,用于增加某个唯一组合的列值。

我想编写一个DB2存储过程,其中SEQ_I是一个列值,只应针对列值(SCHOOL_I, DEPT_ILIST_I)的单个组合递增。

在我的下面的程序中,我想将max(SEQ_I) + 1用于学校,部门和列表组合

SCHOOL_I, DEPT_I, LIST_ISEQ_I是表SCHOOL_DEPT

的列

我尝试用以下方式编写它。请指导。

CREATE PROCEDURE CREATE_PCT_OFF_SUPPLIER  
        (IN IN_SCHOOL_I INTEGER
        ,IN IN_DEPT_I CHAR(6)
        ,IN IN_LIST_I INTEGER
        ,IN IN_SEQ_I SMALLINT)
P1: BEGIN
        SELECT COUNT(*) AS COMB FROM SCHOOL_DEPT
        WHERE SCHOOL_I= IN_SCHOOL_I AND DEPT_I=IN_DEPT_I AND LIST_I = IN_LIST_I;

        IF COMB = 1 THEN  
        INSERT INTO SCHOOL_DEPT(SCHOOL_I,DEPT_I, LIST_I,SEQ_I) VALUES (IN_SCHOOL_I, IN_DEPT_I, _IN_LIST_I, MAX(IN_SEQ_I)+1); 
        ELSE
        INSERT INTO SCHOOL_DEPT(SCHOOL_I,DEPT_I, LIST_I) VALUES (IN_SCHOOL_I, IN_DEPT_I, _IN_LIST_I); 
END P1

2 个答案:

答案 0 :(得分:0)

您对要执行的操作的描述与存储过程的操作不符。它将添加列而不增加值。要增加值,则需要使用update语句,例如

update SCHOOL_DEPT
set SEQ_I=SEQ_I+1
where SCHOOL_I= IN_SCHOOL_I AND DEPT_I=IN_DEPT_I AND LIST_I = IN_LIST_I;

如果您发现一条记录与学校,部门和列表的组合相匹配,并添加SEQ_IIN_SEQ_I+1的记录,则您正在执行的操作是添加记录。不确定为什么要计算单个数字的最大值(甚至不确定最大函数是否可以这样使用)。除此之外,如果未设置组合或在未设置SEQ_I的情况下多次找到该组合,则添加记录。

答案 1 :(得分:0)

以下代码对我有用:

DECLARE SEQ SMALLINT DEFAULT 0 ;

SELECT MAX(SEQ_I)+1 INTO SEQ FROM FROM SCHOOL_DEPT
    WHERE SCHOOL_I= IN_SCHOOL_I AND DEPT_I=IN_DEPT_I AND LIST_I = IN_LIST_I;

IF SEQ IS NULL THEN 
    SET SEQ = 1; 
END IF;