레이블이 SQL인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SQL인 게시물을 표시합니다. 모든 게시물 표시

2015년 1월 22일 목요일

#84. 오라클 시퀀스(Oracle Sequence)

#84. 오라클 시퀀스(Oracle Sequence) 

시퀀스(Sequence) 

 다중 사용자 환경에서 사용하는 숫자 자동 생성기. 
 PK, UK 칼럼의 값을 유일하게 자동으로 생성하는 경우에도 사용된다. 
 트랜잭션 내에서 시퀀스가 생성되어 사용되다가 롤백 되는 경우에 다음 시퀀스 번호는 SKIP 될 수 있다. 
 테이블 또는 칼럼과는 독립적으로 생성, 삭제된다. 
 CURRVAL : 시퀀스의 현재 값을 리턴 
 NEXTVAL : 시퀀스를 증가시키고 next value를 리턴한다. 

 [형식] 
CREATE SEQUENC sequence_name 
                [INCREMENT BY n] 
                [START WITH n] 
                [{MAXVALUE n | NOMAXVALUE}] 
                [{MINVALUE n | NOMINVALUE}] 
                [{CYCLE | NOCYCLE}] 
                [{CACHE n | NOCACHE}] 

 INCREMENT BY n : 생성되는 Sequence번호의 간격을 정수 n으로 정의.  옵션이 생략되면 시퀀스는 1씩 증가한다.
 START WITH n : 첫 번째 Sequence 번호를 정의, 옵션이 생략되면 시퀀스는 1부터 시작한다. 
 MAXVALUE n : Sequence의 최대값을 정의. NOMAXVALUE가 default이며 최대값은 10의 27승이다. 
 MINVALUE n : 생성 가능한 Sequence의 최소값을 정의, 디폴트가 NOMINVALUE이며 최소값은 1이다. 
 CACHE n : 서버가 메모리 캐시에 미리 생성해 놓는 시퀀스 개수. 기본갓은  20이다.  캐시하지 않으려면 NOCACHE 옵션을 사용한다. 

[시퀀스를 사용할 수 없는 예] 
SQL> CREATE TABLE seq_tab ( a NUMBER DEFAULT s1.NEXTVAL); 
(* Error 발생) 
SQL> SELECT DISTINCT s1.NEXTVAL FROM dual; 
(* Error 발생) 
SQL> SELECT SUM(salary) FROM s_emp GROUP BY s1.NEXTVAL; 
(* Error 발생) 


SQL> create sequence seq_e1; 

시퀀스가 생성되었습니다. 

SQL> select seq_e1.currval from dual; 
select seq_e1.currval from dual 
      * 
1행에 오류: 
ORA-08002: 시퀀스 SEQ_E1.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다 
-- 최초 한번은 NEXTVAL해야 CURRVAL 값을 조회 가능하다. 

SQL> create table test4 (n number); 

테이블이 생성되었습니다. 

SQL> insert into test4 values (seq_e1.nextval); 

1 개의 행이 만들어졌습니다. 

SQL> insert into test4 values (seq_e1.nextval); 

1 개의 행이 만들어졌습니다. 

SQL> insert into test4 values (seq_e1.nextval); 

1 개의 행이 만들어졌습니다. 


SQL> select * from test4; 

        N 
---------- 
        1 




SQL>  drop sequence seq_e1; 

시퀀스가 삭제되었습니다.

[PLSQL 반복문, LOOP, FOR, WHILE 예제]임의의 수입력받아 그수까지의 합을 구하는 예제

[PLSQL 반복문, LOOP, FOR, WHILE 예제]임의의 수입력받아 그수까지의 합을 구하는 예제 

Accept를 이용하여 숫자를 입력받고 1부터 그 수까지의 합을 구하세요 

- basic loop문 
- for loop문 
- while loop문 

-------------------------------------------------------------------------------------------------- 

1. BASIC LOOP 이용 


SQL>edit a 

set serveroutput on 
accept p_num prompt 'Enter a number : ' 
create or replace procedure sum1 
is 
  v_sum number := 0; 
  i number := 0; 
begin 
  
  loop 
      i := i + 1; 
      v_sum := v_sum + i;
      exit when  i >= &p_num ; 
  end loop; 
  dbms_output.put_line(&p_num || '까지 합은 ' || v_sum); 
end; 


SQL>@a 

Enter a number : 10 
구  10:      exit when  i >= &p_num ; 
신  10:      exit when  i >= 10 ; 
구  12:    dbms_output.put_line(&p_num || '까지 합은 ' || v_sum); 
신  12:    dbms_output.put_line(10 || '까지 합은 ' || v_sum); 

프로시저가 생성되었습니다. 

SQL> exec sum1; 
10까지 합은 55 

PL/SQL 처리가 정상적으로 완료되었습니다. 



2. FOR LOOP 이용 

SQL>edit a1 

set serveroutput on 
accept p_num prompt 'Enter a number : ' 
create or replace procedure sum2 
is 
  v_sum number := 0; 
begin 
  
  for i in 1..&p_num loop 
      v_sum := v_sum + i;
  end loop; 
  dbms_output.put_line(&p_num || '까지 합은 ' || v_sum); 
end; 



SQL> @a1 
Enter a number : 10 
구  6:    for i in 1..&p_num loop 
신  6:    for i in 1..10 loop 
구  9:    dbms_output.put_line(&p_num || '까지 합은 ' || v_sum); 
신  9:    dbms_output.put_line(10 || '까지 합은 ' || v_sum); 

프로시저가 생성되었습니다. 

SQL> exec sum2; 
10까지 합은 55 

PL/SQL 처리가 정상적으로 완료되었습니다. 


3. WHILE LOOP 이용 


SQL>edit a2 

set serveroutput on 
accept p_num prompt 'Enter a number : ' 
create or replace procedure sum3 
is 
  i number := 0; 
  v_sum number := 0; 
begin  
    while (i < &p_num) loop 
      i := i + 1; 
      v_sum := v_sum + i;     
  end loop; 
  dbms_output.put_line(&p_num || '까지 합은 ' || v_sum); 
end; 



SQL>@a2 

Enter a number : 10 
구  6:    while (i < &p_num) loop 
신  6:    while (i < 10) loop 
구  10:    dbms_output.put_line(&p_num || '까지 합은 ' || v_sum); 
신  10:    dbms_output.put_line(10 || '까지 합은 ' || v_sum); 

프로시저가 생성되었습니다. 

SQL> exec sum3 
10까지 합은 55 

PL/SQL 처리가 정상적으로 완료되었습니다.