|
|||||
================================================ * 오라클 정보공유 커뮤니티 oracleclub.com * http://www.oracleclub.com * http://www.oramaster.net * 운영자 : 김정식 (oramaster _at_ naver.com) ================================================ |
※ oracleclub 강좌를 다른 홈페이지에 퍼가실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^ |
-------------------------------------------------------------------------------------------------------------------
# SEQUENCE - 같은말 반복
[ 대부분 SEQ 사용 ]
-----------------------------------------------------------------------------
CREATE SEQUENCE SEQ1
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOMINVALUE
NOCYCLE
NOCACHE
[ 1 ] SEQUENCE 생성 -> 하나의 Object
-----------------------------------------------------------------------------
CREATE SEQUENCE SEQ1
START WITH 1 // 처음 시작값
INCREMENT BY 1 // 1씩 증가
MAXVALUE 1E27 // 최대값
MINVALUE 1 // 최소값(다시 시작할때는 1부터 시작)
CYCLE // 최대값이 지나면 다시 시작해서 사용
NOCACHE // 캐쉬상 메모리에 올려놓지 않는다
[ 2 ] 지우거나 수정
-----------------------------------------------------------------------------
DROP SEQUENCE SEQ1;
ALTER SEQUENCE SEQ1 CYCLE;
-> START WITH는 ATER로 변경할 수 없다.
[ 3 ] 테이블 생성 및 SEQ1 적용
-----------------------------------------------------------------------------
CREATE TABLE SEQTEST (
NO NUMBER,
NAME VARCHAR2(10)
);
CREATE TABLE SEQTEST2
AS
SELECT * FROM SEQTEST;
[ 4 ] SEQUENCE의 마지막 값 조회
------------------------------------------------------------------------------
SELECT LAST_NUMBER
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'SEQ1';
[ 5 ] SEQUENCE의 현재 값 조회
------------------------------------------------------------------------------
SELECT SEQ1.CURRVAL
FROM DUAL;
▶ SEQUENCE를 사용할 수 없는 경우 : SEQUENCE는 PL/SQL과 SQL 코딩시 몇몇 제한되게 사용됨.
-----------------------------------------------------------------------------------------------
ex 1 )
INSERT INTO TEST (AAA, BBB)
SELECT AAA, TEST_SEQ.NEXTVAL
FROM TEST
ORDER BY BBB;
[ORA-02287: sequence number not allowed here] 라는 에러를 발생할 것이다.
ex 2 )
SELECT TEST_SEQ.NEXTVAL FROM DUAL
UNION ALL
SELECT TEST_SEQ.NEXTVAL FROM DUAL
[ORA-02287: sequence number not allowed here]
ex 3 )
SELECT COUPON_STR,
COUPON_SEQ
FROM AA
WHERE GAMEID = 'high'
AND COUPON_SEQ = AA_SQ1.NEXTVAL
ex 4 ) 등등.. 그룹함수도 마찬가지...
▶ SEQUENCE 사용 불가
SELECT 문
1. WHERE 절 안에서
2. GROUP BY나 ORDER BY 절에서
3. DISTINCT 절에서
4. UNION 이나 INTERSECT 나 MINUS 와 함께 사용 할때
5. 서브 쿼리 안에서
기타
6. UPDATE나 DELETE 의 서브쿼리
7. VIEW나 SNAPSHOPT 에서
8. 테이블 정의시 CHECK 조건이나 DEFAULT 에서
-----------------------------------------------------------------------------------------------
회피 방법 생각해 볼 문제....
▶ SEQUENCE 초기화
-----------------------------------------------------------------------------------------------
※ 힌트 : 증가된 시퀀스번호만큼 빼주어 값을 초기화하는 프로지져를 생성한다.
http://blog.naver.com/jadin1 참고.
CREATE OR REPLACE PROCEDURE P_RESET_SEQ(SEQ_NAME IN VARCHAR2)
IS
L_VAL NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL ' INTO L_VAL;
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' INCREMENT BY -' || L_VAL || ' MINVALUE 0';
EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL ' INTO L_VAL;
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' INCREMENT BY 1 MINVALUE 0';
END;
출처 : Tong - 병조님의 Oracle통
'DataBase > Oracle' 카테고리의 다른 글
sqldeveloper - locale not recognized (1) | 2017.11.27 |
---|---|
오라클 조인 업데이트 (다중업데이트) - Case 1 (0) | 2017.11.22 |
오라클 WITH (0) | 2017.11.22 |
오라클 시퀀스 ( Sequence ) (0) | 2017.11.22 |
오라클에 돌고 있는 쿼리 시간 및 쿼리 확인하기 (0) | 2010.09.28 |
댓글