DECODE, CASE 문 내에서 컬럼1개의 값이 NULL일 경우에만 시퀀스를 호출해서 값을 셋팅하려고 합니다.
하지만 컬럼1개의 값이 NULL이 아닌데 시퀀스를 호출하고 있습니다.
컬럼1의 값이 존재할 때에는 시퀀스낭비 없이, 값이 없을때에는 시퀀스값을 호출하게 하고 싶습니다.
낭비를 하고 싶지 않아서 문의 드립니다.
오라클버전은 9i 이며, 샘플은 1개의 row 지만 실제 구현할 것은 복수row입니다.
--시퀀스 샘플 생성
--CREATE SEQUENCE SEQ_TEST
-- START WITH 1
-- MAXVALUE 99999999999999
-- MINVALUE 1
-- NOCYCLE
-- NOCACHE
-- ORDER;
--시퀀스 호출 샘플
SELECT
-- CASE WHEN COL1 IS NOT NULL
-- THEN COL1
-- ELSE TO_CHAR(SEQ_TEST.NEXTVAL) END AS A,
DECODE(COL1, '', TO_CHAR(SEQ_TEST.NEXTVAL) , COL1) AS B
FROM (
SELECT '1' AS COL1 FROM DUAL
) ;
시퀀스 낭비 안하는 방법을 좀 알려주세요....
시퀀스를 리턴하는 function을 만들어 사용하시면 됩니다.
CREATE OR REPLACE FUNCTION PMSDB.FN_SEQ_TEST RETURN NUMBER IS v_NUM NUMBER := 0 ; BEGIN select SEQ_TEST.nextval into v_num from dual; RETURN v_NUM; END; SELECT -- CASE WHEN COL1 IS NOT NULL -- THEN COL1 -- ELSE TO_CHAR(SEQ_TEST.NEXTVAL) END AS A, -- DECODE(COL1, '', TO_CHAR(SEQ_TEST.NEXTVAL) , COL1) AS B DECODE(COL1, '', FN_SEQ_TEST , COL1) AS B FROM ( SELECT '1' AS COL1 FROM DUAL ) ;
다만 아시다시피 대량의 row처리시 function의 reculsive call로 인한 overhead는 있을수 있읍니다.
숫자를 건너뛰는 비효율과 overhead사이에 trade off는 감안하세요~