Oracle PL/SQL 강좌
PL/SQL 테이블 18 20 99,999+

by 구루비 PLSQL TABLE PLSQL 테이블 복합 데이터 타입 [2002.01.20]


  PL/SQL 에서의 테이블은 오라클 SQL에서의 테이블과는 다르다. PL/SQL에서의 테이블은 일종의 일차원 배열이라고 생각하면 이해하기 쉬울것이다.

  테이블은 크기에 제한이 없으면 그 ROW의 수는 데이터가 들어옴에 따라 자동 증가 한다.

  BINARY_INTEGER 타입의 인덱스 번호로 순서가 정해진다.

  하나의 테이블에 한 개의 컬럼 데이터를 저장 한다.

PL/SQL 테이블 문법 및 선언예제

 
-- 선언 예제
TYPE prdname_table IS TABLE OF VARCHAR2(30) 
INDEX BY BINARY_INTEGER; 

-- prdname_table 테이블타입으로 prdname_tab변수를 선언해서 사용 
prdname_tab   prdname_table 

-- 아래 프로시저에서 사용된 예제를 보면 이해가 쉽게 갈 것이다.
    

PL/SQL 테이블 예제

 
SQL> CREATE OR REPLACE PROCEDURE Table_Test
     (v_deptno IN emp.deptno%TYPE)

    IS

     -- 각 컬럼에서 사용할 테이블의 선언 
     TYPE empno_table IS TABLE OF emp.empno%TYPE
     INDEX BY BINARY_INTEGER;

     TYPE ename_table IS TABLE OF emp.ename%TYPE
     INDEX BY BINARY_INTEGER;

     TYPE sal_table IS TABLE OF emp.sal%TYPE
     INDEX BY BINARY_INTEGER;

     -- 테이블타입으로 변수를 선언해서 사용 
     empno_tab  empno_table ;
     ename_tab  ename_table ;
     sal_tab    sal_table;

     i BINARY_INTEGER := 0;

   BEGIN

     DBMS_OUTPUT.ENABLE;

     FOR emp_list IN(SELECT empno, ename, sal 
                     FROM emp WHERE deptno = v_deptno) LOOP

      /* emp_list는 자동선언되는 BINARY_INTEGER형 변수로 1씩 증가한다. 
         emp_list대신 다른 문자열 사용가능 */

            i := i + 1;

           -- 테이블 변수에 검색된 결과를 넣는다
            empno_tab(i) := emp_list.empno ;     
            ename_tab(i) := emp_list.ename ;
            sal_tab(i)   := emp_list.sal ;

      END LOOP;

      -- 1부터 i까지 FOR 문을 실행 
      FOR cnt IN 1..i LOOP

         -- TABLE변수에 넣은 값을 뿌려줌 
         DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || empno_tab(cnt) );
         DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || ename_tab(cnt) );
         DBMS_OUTPUT.PUT_LINE( '사원급여 : ' || sal_tab(cnt));

      END LOOP;

  END; 
  /

-- (DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용)
SQL> SET SERVEROUTPUT ON ;
 
실행 결과 
SQL> EXECUTE Table_Test(10);

사원번호 : 7782
사원이름 : CLARK
사원급여 : 2450
사원번호 : 7839
사원이름 : KING
사원급여 : 5000
사원번호 : 7934
사원이름 : MILLER
사원급여 : 1300 

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

-- emp 테이블에 있는 데이터의 입력한 부서에 해당하는 사원번호, 
-- 사원이름, 사원급여를 뿌려주는 프로시저 이다 

    

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

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

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

by 초보자 [2005.12.20 11:08:11]
PL/SQL 테이블 사용은 데이터 타입을 뒤에쓰고, 변수명을 앞에 쓰는 건가 보군여...

by 장룡일 [2005.12.20 19:40:30]
리해가 잘 되네요.
너무 고마워요...
앞으로도 좋은 글 많이 올려주세요.

by Ora [2006.06.16 14:57:27]
넘흐 좋아요....ㅠ.ㅠ 고맙습니다..
이제야..이런걸 보다니..-_-;;;욜띠미 할께요!!

by 노루삼촌 [2006.08.30 21:26:48]
후.. 어렵다 ㅋㅋ 헷갈려

by 엠제이 [2006.09.25 21:10:06]
완죤 내스탈인데..

by 흐음.. [2007.10.25 11:12:40]
그림을 넣어주시면 좋겠는데~ 넘 무리한 부탁인가요~^^;

by 김윤경 [2007.11.08 14:55:00]
테이블의 필드 하나 하나를 배열이라 생각하면 되겠네요.
이제 좀 이해가 가네요.

by 김민우 [2007.11.23 19:59:13]
테이블의 길이가 얼마인지 알아보는 파라메터 같은거 없을까요?

by 김민우 [2007.11.23 20:02:05]
위에서 테이블 길이란 것은 테이블에 들어가 있는 데이터의 갯수...
일차원 배열이라고 생각하면, 배열안에 아이템의 갯수를 이야기하는데요.
이거 몇개인지 상기처럼 for문으로 헤아리는거 말고 테이블을 이용해서
알수 있는 방법 같은거 없을까요?

by 무리 [2008.04.29 23:21:03]
empno_tab.length 이건 아니네요.

by CHOBO [2008.05.20 14:12:29]
v_deptno값을10으로 넣었을땐 실행 결과 잘 나오지만 다른 수를 넣었을땐

정상적으로 완료 <- 이 메세지만 나오고 외 실행결과는 안나오나요??''

by 그거는 [2008.09.03 13:09:39]
CHOBO// 그거는 deptno 를 기준으로 하기 때문이죠;
deptno (부서명) 은 10,20,30 이 있습니다..
20 이나 30을 넣으면 또 잘 나옵니다용^^

by 마릴리온 [2008.11.13 13:43:50]
SELECT empno, ename, sal BULK COLLECT INTO empno_tab, ename_tab, sal_tab
FROM emp;

FOR iLoop IN 1.. empno_tab.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE(empno_tab(iLoop));
END LOOP;

by 와인이 [2009.09.10 20:41:16]
오늘도.. 흐믓 -ㅋㅋ

by 누가설명좀 [2011.06.08 15:41:03]
emp_list는 자동선언되는 BINARY_INTEGER형 변수로 1씩 증가한다....
이게 뭔 말이죠..이해가 잘..;;
emp_list가 인트 타입인데..어케 empno_tab(i) := emp_list.empno ; ..이런식이 가능하죠..첨 보기에는 foreach 문비슷하다고 생각했는데...선택한 칼럼을 리스트에 대입하는 식으로..주석보니까 그게 아니고..어렵네여..누가 설명좀.;;

by 개곰자리 [2012.06.14 17:26:30]
TYPE empno_table IS TABLE OF emp.empno%TYPE INDEX BY BINARY_INTEGER;
위의 내용을 사용하는 이유가 뭔가요? 뭔가 복잡해질것 같은 그런 느낌이 드는 데요.
굳이 이런것도 사용해야 하나요?

by 김태형 [2013.12.10 14:49:39]
제가 다니는 현장에서는 프로시져 인수에 복수의 열 정보(배열형태)를 넣습니다. 

그러면 오라클 pl.sql의 프로시져 인수또한 배열 형태가 되어야 합니다. 
그때 프로시져 인수 TYPE을 TABLE 형태로 만들어서 맞이 하고 있습니다. 

저도 이미 만들어 놓은거 사용하면서 분석한거라 형태가 그리된다는 사실만 알고 있습니다. 



by 승굴 [2013.07.05 15:07:26]
이해가 잘 되네요 .. ㅎㅎ 감사합니다. 

by 상유니 [2015.08.12 20:02:01]

테이블타입 변수라....쓸일이 과연 있을까요????


by 칙힝 [2015.08.25 11:43:36]

BINARY_INTEGER 과 더불어 PLS_INTEGER 도 사용가능한데

속도 차이라고 알고있습니다.

 

혹시 자세한 차이를 아시는 분께 설명 부탁드려요

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