프린트 하기

 

OS환경 : Oracle Linux6.8(64bit)

 

DB 환경 : Oracle Database 11.2.0.4

 

쿼리 : 

#반복시킬 테이블 생성 및 데이터 삽입

1
2
3
SQL> CREATE TABLE IMSI (C1 NUMBER, C2 NUMBER);
SQL> INSERT INTO IMSI VALUES (1,2);
SQL> COMMIT;

 

#프로시저 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
CREATE OR REPLACE PROCEDURE fortest1
     IS
        CURSOR cursor1 IS
        SELECT * FROM IMSI;
     BEGIN
-- 여기에 1..5 으로 반복횟수 지정(아래는 5회 반복)
     for i in 1..5 loop 
       FOR list IN cursor1 LOOP
--여기에 컬럼들 명시
          DBMS_OUTPUT.PUT_LINE('c1 : ' || list.c1);
          DBMS_OUTPUT.PUT_LINE('c2 : ' || list.c2);  --(컬럼 여러개면 이렇게 작성)
       END LOOP;
     end loop;
   END;
   /

 

이렇게도 작성가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> 
CREATE OR REPLACE PROCEDURE fortest2
     IS
        CURSOR cursor2 IS
        SELECT * FROM IMSI;
     BEGIN
-- 여기에 1..5 으로 반복횟수 지정(아래는 5회 반복)
     for i in 1..5 loop 
       FOR list IN cursor2 LOOP
--여기에 컬럼들 명시
          DBMS_OUTPUT.PUT_LINE('c1 c2');
          DBMS_OUTPUT.PUT_LINE('----------------');
          DBMS_OUTPUT.PUT_LINE(list.c1 || ' ' || list.c2);
       END LOOP;
     end loop;
   END;
   /

 

#PLSQL 나오게 끔 설정

1
SQL> SET SERVEROUTPUT ON ; 

# fortest1 실행

1
SQL> EXECUTE fortest1;

 

 

결과값 : 

1
2
3
4
5
6
7
8
9
10
11
12
c1 : 1
c2 : 2
c1 : 1
c2 : 2
c1 : 1
c2 : 2
c1 : 1
c2 : 2
c1 : 1
c2 : 2
 
PL/SQL procedure successfully completed.

 

# fortest2 실행

1
SQL> EXECUTE fortest2

 

결과값 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
c1 c2
----------------
1 2
c1 c2
----------------
1 2
c1 c2
----------------
1 2
c1 c2
----------------
1 2
c1 c2
----------------
1 2
 
PL/SQL procedure successfully completed.

 

 

관련 에러 

for 구문에 너무 많이 반복을 시키는 경우 아래 에러 발생

1
2
3
4
5
6
7
*
ERROR at line 1:
ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes 
ORA-06512"SYS.DBMS_OUTPUT", line 91
ORA-06512"SYS.DBMS_OUTPUT", line 58 
ORA-06512: at "JSH.FORTEST", line 81
ORA-06512: at line 1

 

조치방법

 

1
set serveroutput on size 10000(원하는 size, 최대가 1000000)

 

그이상의 값을 입력하면 아래 경고 발생함

1
2
SQL> set serveroutput on size 10000000
SP2-0547: size option 10000000 out of range (2000 through 1000000)

 

 

추가

아래와 같이 사용하면 위 테이블을 반복해서 조회할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL>
declare
l_counter number := 0;
l_result1 number;
l_result2 number;
begin
while l_counter < 1000 loop
select c1, c2 into l_result1, l_result2 from imsi;
dbms_output.put_line(l_result1||','||l_result2);
l_counter := l_counter + 1;
end loop;
end;
/
 
1,2
1,2
1,2
1,2
.
.
 
PL/SQL procedure successfully completed.

 

 

참조 : http://www.gurubee.net/lecture/1065

 

https://positivemh.tistory.com/80

 

dual 테이블 반복 시키고 싶을 때

OS환경 : Oracle Linux6.8(64bit) DB 환경 : Oracle Database 11.2.0.4 방법 : dual 테이블 반복 시키고 싶을 때 1 select 1 from dual; 이 문장을 반복시키고 싶을 때 pl/sql의 for문 while, loop 문등을 모두 써서 해보려했지

positivemh.tistory.com