Oracle PL/SQL 강좌
FOR LOOP 19 16 99,999+

by 구루비 FOR LOOP [2002.01.20]


FOR LOOP 문법

  • - index 는 자동 선언되는 binary_integer형 변수이고, 1씩 증가 한다.
  • - reverse 옵션이 사용 될 경우 index 는 upper_bound에서 lower_bound로 1씩 감소 한다.
  • - IN 다음에는 coursorselect 문이 올 수 있다.

FOR LOOP 예제

 
    DECLARE

    -- 사원 이름을 출력하기 위한 PL/SQL 테이블 선언 
    TYPE ename_table IS TABLE OF emp.ename%TYPE
    INDEX BY BINARY_INTEGER;
	
    -- 사원 급여를 출력하기 위한 PL/SQL 테이블 선언 
    TYPE sal_table IS TABLE OF emp.sal%TYPE
    INDEX BY BINARY_INTEGER;
	
    ename_tab    ename_table;
    sal_tab      sal_table;
	
    i BINARY_INTEGER := 0;

BEGIN

    DBMS_OUTPUT.ENABLE;
	
    FOR emp_list IN  (SELECT ename, sal 
	                  FROM emp 
	                  WHERE deptno = 10) LOOP
	
        i := i +1 ;
	
        -- 테이블에 상품 이름을 저장
        ename_tab(i) := emp_list.ename;
	        
        -- 테이블에 상품 가격을 저장 
        sal_tab(i)   := emp_list.sal;        
	
    END LOOP;
	
    --  화면에 출력
    FOR cnt IN  1..i   LOOP  
	
        DBMS_OUTPUT.PUT_LINE('사원이름 : ' || ename_tab(cnt)); 
        DBMS_OUTPUT.PUT_LINE('사원급여 : ' || sal_tab(cnt));
	
    END LOOP;

END;
/ 

사원이름 : CLARK
사원급여 : 2450
사원이름 : KING
사원급여 : 5000
사원이름 : MILLER
사원급여 : 1300

        

- 강좌 URL : http://www.gurubee.net/lecture/1056

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by Junny [2006.08.29 18:14:43]
end; 밑으로 결과값이 안나오고 바로 PL/SQL 처리가 정상적으로 완료되었습니다. 만 나오는데..결과값은 어떻게 확인 할 수 있나요?

by 양재상 [2006.09.07 22:33:17]
SQL>SET SERVEROUTPUT ON
이거 먼저 하시고 실행해보세요.
DBMS_OUTPUT.PUT_LINE 명령으로 출력한 결과가 나오려면 저걸 켜줘야 되요.

by 엽 [2006.09.27 11:58:02]
SET SERVEROUTPUT ON 와 sql 을 같이 실행 해야 나오는군요
하나 하나 시키니깐 안 나오네요 ㅡ.ㅡ;

by 찰스 [2006.11.30 15:03:02]
항상 필요할때 참고할 수 있어 감사합니다.

by d [2007.03.19 14:28:49]
INDEX BY BINARY_INTEGER <-
1) 인텍스 구문이 반드시 필요 한 구문인가요?
2) 위에 구문이 실행하는 정확한 뜻(해석)은 모죠??
3) BINARY_INTEGER <- 데이터 형식이 쓰여질때가 언제인가요??
^^ 알려주세요 ^^

by My1over [2007.03.22 09:38:52]
저도 공부중이라 잘은 모르지만 제 생각에는
1) 예(암시적으로 생략할 수 있는지는 아직 모르겠지만..)
2) BINARY_INTEGER 타입의인덱스 번호로 순서가 정해집니다.
i BINARY_INTEGER := 0; 에서 BINARY_INTEGER 타입의 변수 i를 선언해서
ename_tab(i) := emp_list.ename; 과 같이 ename_tab의 인덱스로 사용하고 있죠
3) BINARY_INTEGER -2147483647에서 2147483647 사이의 정수

by My1over [2007.03.22 09:44:13]
- index 는 자동 선언되는 binary_integer 형 변수이고. 1씩 증가합니다.
라고 하셨는데 두개의 FOR문 중 밑의 cnt 는 위의 설명이 맞는듯 합니다
하지만 위의 FOR emp_list IN (SELECT ename, sal FROM emp WHERE deptno = 10) LOOP 에서 emp_list는 IN 뒤의 SELECT문의 결과를 순차적으로 나타내는 것 아닌가요?

by 11lee [2007.03.26 14:51:47]

Table of Record 에서 배운 것과 유사한 타입이ㄱ겠다는 생각이;;


by 김윤경 [2007.11.08 18:09:09]
이것을 토트에서 테스트 하는 방법은 없나요.
sql*plus 에서는 잘 되네요.

by 무리 [2008.04.29 23:40:48]
index, emp_list 는 자동 선언된다고 설명하고 있소.
또한 index는 자동증가형이라고 부가적으로 설명하고 있는데 왜 다들..
즉 ename_table 변수는 테이블변수이고 자동증가형이다 뭐 이런깊은 뜻 아닐까요.

by 능력자 [2008.08.27 09:35:07]
자료 항상 잘보고 있습니다..

이제막 개발자길로 들어선 저는 쿼리가 제일 난감한데..

이곳에서 보면서 도움이 많이 됩니다 .. ㅎㅎ;;

by 누크 [2010.03.31 14:47:44]
김윤경//토드에서도 결과 나오는곳에서 마우스 오른쪽 누르시고
DBMS OUTPUT을 체크 하시면
DBMS_OUTPUT.PUT_LINE 하셔서 결과 볼수 있습니다
많이 늦었지만 ^^;

by 디스타임 [2010.04.08 16:00:12]
쓰여진대로 생각하려면 복잡하니 그냥 식별자구나라고 생각하는게 편할 거에요..^^

by 신화씨앤씨 [2014.02.19 21:27:34]
감사합니다

by 가을에사랑 [2014.09.29 16:59:24]

강좌 감사하게 보고 있습니다.

그런데, 질문하나 있어욤

제가 잘 몰라서 그러는데요

insert, update, delete에 나와 있는 예제는

실행하고 나면 프로시저 이름들이 각각 생성이 되어서

언제든지 호출해서 실행하게 되었었는데

그런데 이번 프로시저는 따로 이름이 생성되지는 않고

실행할 때마다 전체를 다시 실행해야 실행되더라구요

 

무엇을 모르는걸까요?

사용환경은 토드에서 하고 있습니다.


by 가을에사랑 [2014.09.29 17:53:01]

아래처럼 변경해서 실행했더니 결과가 잘 나오네요 맞는거겠져?

 

CREATE OR REPLACE PROCEDURE emp_list
    (v_deptno IN emp.deptno%TYPE )

IS
-- 사원 이름을 출력하기 위한 PL/SQL 테이블 선언
    TYPE ename_table IS TABLE OF emp.ename%TYPE
    INDEX BY BINARY_INTEGER;
       
    -- 사원 급여를 출력하기 위한 PL/SQL 테이블 선언
    TYPE sal_table IS TABLE OF emp.sal%TYPE
    INDEX BY BINARY_INTEGER;
       
    ename_tab    ename_table;
    sal_tab      sal_table;
       
    i BINARY_INTEGER := 0;

BEGIN

    DBMS_OUTPUT.ENABLE;
       
    FOR emp_list IN  (  SELECT ename, sal
                        FROM emp
                        WHERE deptno = v_deptno) LOOP
           
        i := i +1 ;
           
        -- 테이블에 상품 이름을 저장
        ename_tab(i) := emp_list.ename;
                   
        -- 테이블에 상품 가격을 저장
        sal_tab(i)   := emp_list.sal;       
       
    END LOOP;
       
    --  화면에 출력
    FOR cnt IN  1..i   LOOP 
       
        DBMS_OUTPUT.PUT_LINE('사원이름 : ' || ename_tab(cnt));
        DBMS_OUTPUT.PUT_LINE('사원급여 : ' || sal_tab(cnt));
       
    END LOOP;


END ;
/

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