안녕하세요.
요즘 DB2 작업을 하게 되면서 이 사이트에 많이 접하게 되네요.
많은 도움이 되는 것 같습니다.
본론으로 들어가서 아래의 트리거 및 프로시져를 DB2 로 컨버젼하여 사용하고 싶은데요.
잘 되지가 않아 이렇게 질문드립니다.
INFORMIX> PROCEDURE
CREATE PROCEDURE get_maxidx(v_chtime DATE)
RETURNING INT;
DEFINE v_maxidx INT;
SELECT nvl(max(chtime_idx), 0) + 1 INTO v_maxidx FROM changeinfo WHERE chtime = v_chtime;
RETURN v_maxidx;
END PROCEDURE;
INFORMIX> TRIGGER
CREATE TRIGGER changeinfo_trigger
INSERT ON changeinfo REFERENCING NEW AS new
FOR EACH ROW (EXECUTE PROCEDURE get_maxidx(new.chtime) INTO chtime_idx);
위의 내용을 설명 드리면, changeinfo라는 테이블에 데이터가 삽입되면 삽입된 데이터(chtime_idx 컬럼을 제외한)와 함께 changeinfo 테이블 내에
chtime_idx(INT 형)라는 컬럼의 값을 이전 레코드의 chtime_idx + 1로 삽입하려는 것입니다.
즉, changeinfo 테이블 데이터가 아래와 같다면,
------------------------------------------------
chdata | chtime_idx
------------------------------------------------
a 1
b 2
"inser into changeinfo (chdata) values ('c');" 라고 데이터를 삽입하면 자동으로 트리거가 작동하여
아래와 같이 changeinfo 테이블에 데이터가 삽입됩니다.
------------------------------------------------
chdata | chtime_idx
------------------------------------------------
a 1
b 2
c 3
위의 내용을 제 나름대로 DB2로 변경하려고 시도한 내용이 아래와 같습니다.
DB2> PROCEDURE
CREATE PROCEDURE get_maxidx(IN v_chtime DATE)
DYNAMIC RESULT SETS 0
LANGUAGE SQL
BEGIN
DECLARE v_maxidx INT DEFAULT 0;
SELECT COALESCE(MAX(chtime_idx), 0) + 1 INTO v_maxidx FROM changeinfo WHERE chtime = v_chtime;
RETURN v_maxidx;
END
DB2> TRIGGER
CREATE TRIGGER changeinfo_trigger
AFTER INSERT ON changeinfo REFERENCING NEW AS new
FOR EACH ROW (CALL PROCEDURE get_maxidx(new.chtime) INTO chtime_idx);
위와 같이 변경하니 트리거 생성 시 오류가 나네요. 알고 계신 분들은 답변 부탁드립니다. ^^
|