Db2存储过程,用于增加某个唯一组合的列值。
我想编写一个DB2存储过程,其中SEQ_I
是一个列值,只应针对列值(SCHOOL_I, DEPT_I
和LIST_I
)的单个组合递增。
在我的下面的程序中,我想将max(SEQ_I) + 1
用于学校,部门和列表组合
SCHOOL_I, DEPT_I, LIST_I
和SEQ_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
答案 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_I
与IN_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;