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
'ORACLE > Sql' 카테고리의 다른 글
pipe를 통하여 백업 & 압축하는 exp/imp 명령어 (0) | 2018.06.11 |
---|---|
Oracle Table, index 별 사용용량 구하는 SQL (0) | 2018.06.11 |
대량 데이터 삽입 insert 빠르게 실행 벌크 insert (0) | 2018.05.29 |
undo 사용량 확인 (0) | 2018.05.25 |
sql 문법 검사해주는 사이트 (0) | 2018.05.17 |