DECODE, CASE 문 내의 시퀀스 호출 0 5 4,610

by 빈이 시퀀스 SEQUENCE [2014.05.12 17:19:49]


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
    ) ;

시퀀스 낭비 안하는 방법을 좀 알려주세요....

by DarkBee [2014.05.12 18:23:37]

시퀀스는 Row수만큼 생성되요~


by 마농 [2014.05.12 18:30:03]
-- NVL
-- CASE
-- COALESCE
-- UNION ALL
-- INSERT ALL
-- 위에 것 모두 테스트 해봤으나 실패했습니다.
-- 마지막으로 TRIGGER 만 성공

CREATE OR REPLACE TRIGGER tri_test
BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
    IF :new.col1 IS NULL THEN
        :new.col1 := seq_test.NEXTVAL;
    END IF;
END;
/

 


by 백면서생 [2014.05.13 10:17:57]

시퀀스를 리턴하는 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는 감안하세요~


by 빈이 [2014.05.19 13:44:38]

먼저 답변주신 모든 분들께 감사드립니다.

전에 확인하고 답변 달은줄 알았더니 안달았네요;;

트리거, 펑션에서 가능하지만 한두개 테이블을 작업을 하는 것이 아니라서

일일히 만들면 관리하기가 힘들것 같아서 WHERE 조건에 NOT NULL 인것으로 SELECT -> INSERT 한번 하고, NULL 인것으로 SELECT -> INSERT 한번, 이렇게 2번 작업을 나눠어서 개발을 하기로 했습니다.

다시한번 답변주신 모든 분들께 감사드립니다.^^


by 빈이 [2014.05.19 13:46:30]

채택은..... 한분밖에 안되네요 ㅡ_ㅡ;;;

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입