반응형
/********************************************************************************************
-- Title : [10g] PL/SQL 변수 - %ROWTYPE, RECORD, TABLE
-- Reference : radiocom.kunsan.ac.kr baeum.com
-- Key word : rowtype record table 데이터 타입 데이터타입 data type datatype
********************************************************************************************/
  
/****************************************************************
-- -- %ROWTYPE 타입
****************************************************************/
   ㅇ 테이블, 뷰의 행과 같은 각 column의 이름, 타입, 크기 속성으로
      된 record를 만듦
   ㅇ 데이터베이스 테이블명을 %ROWTYPE 앞에다 기술함
   ㅇ 기본 테이블의 column 수나 datatype을 알지 못할 때 편리
   ㅇ 기본 테이블의 column에 변경이 있어도 프로그램 재수정 불필요

-- 샘플 1
create or replace procedure p2(a scott.emp.empno%type)
is
    emp_rec scott.emp%rowtype;
begin
    select * into emp_rec
    from scott.emp
    where empno = a;
   
    dbms_output.put_line('Ename : ' || emp_rec.ename);
    dbms_output.put_line('Sal : ' || to_char(emp_rec.sal));
end;


/****************************************************************
-- RECORD 타입
****************************************************************/
   ㅇ 여러 개의 타입을 갖는 논리적 단위의 테이터 그룹
   ㅇ 하나 이상의 scolar 또는 Record, Table형의 필드를 포함해야 함
   ㅇ 테이블의 행과 동일하지 않음
   ㅇ 초기값을 정할 수 있음(Not Null로 정의 가능)
   ㅇ 초기값이 없는 필드는 Null이 초기값임
  
-- 샘플 1
SET SERVEROUTPUT ON;

DECLARE
    TYPE emp_record_type IS RECORD
    ( empno NUMBER(10)
    , ename scott.emp.ename%TYPE
    , deptno scott.dept.deptno%TYPE
    );    
        
    empInfo emp_record_type;
BEGIN   
    empInfo.empno := 2000;
    empInfo.ename := 'DBRANG';
    empInfo.deptno := 30;
        
    dbms_output.put_line('----------------------------');
    dbms_output.put_line(to_char(empInfo.empno) || ' ' || empInfo.ename);
    dbms_output.put_line(to_char(empInfo.deptno));
END;
/

-- 샘플 2
create or replace procedure scott.p3
( a scott.emp.empno%type
, b scott.emp.empno%type
)
as
    type emp_rec_type is record( ename scott.emp.ename%type
                               , job scott.emp.job%type
                               , sal scott.emp.sal%type
                               , deptno scott.emp.deptno%type
                               );
    emp_rec1 emp_rec_type;
    emp_rec2 emp_rec_type;
begin
    select ename, job, sal, deptno into emp_rec1
    from emp
    where empno = a;
   
    select ename, job, sal, deptno into emp_rec1
    from emp
    where empno = b;
   
    if emp_rec1.sal > emp_rec2.sal
    then
        dbms_output.put_line(emp_rec1.ename || ' WIN');
    elsif emp_rec1.sal < emp_rec2.sal
    then
        dbms_output.put_line(emp_rec2.ename || ' WIN');
    else
        dbms_output.put_line('Their salary is same!!');
    end if;
end;

     
/****************************************************************
-- TABLE 타입
****************************************************************/
   ㅇ PL/SQL 타입은 데이터베이스 테이블과 다름
   ㅇ 1차원 배열과 비슷해서 두가지 구성요소로 되어 있음
      (Binary_Integer와 Scholar 타입 구성)
   ㅇ 제한없이 동적으로 커짐
 
-- 샘플 1
SET SERVEROUTPUT ON;

DECLARE
    TYPE ename_table_type IS TABLE OF emp.ename%TYPE
        INDEX BY BINARY_INTEGER;
              
    ename_table ename_table_type;
BEGIN
    ename_table(1) := '아리랑';
    ename.table(2) := '아리랑';
        
    IF ename_table.EXISTS(1) THEN ....;
END;
 

-- 샘플 2
CREATE TABLE scott.top_dogs (name VARCHAR2(10), salary NUMBER);

CREATE OR REPLACE PROCEDURE scott.up_test2
( v_empno IN scott.emp.empno%TYPE
)
IS
    TYPE ename_table_type  IS TABLE OF VARCHAR2(10)
    INDEX BY BINARY_INTEGER;
           
    ename_table ename_table_type;
       
    TYPE sal_table_type IS TABLE OF NUMBER(7,2)
    INDEX BY BINARY_INTEGER;
       
    sal_table      sal_table_type;
    v_ename        scott.emp.ename%TYPE;
    v_sal          scott.emp.sal%TYPE;
    i              BINARY_INTEGER := 0;
BEGIN
    DELETE FROM scott.top_dogs;
       
    SELECT ename, sal into v_ename, v_sal
    FROM scott.emp WHERE empno = v_empno;
       
    ename_table(i) := v_ename;
    sal_table(i)   := v_sal;
       
    INSERT INTO scott.top_dogs(name, salary)
    VALUES(ename_table(i), sal_table(i));
       
    COMMIT WORK;
END;

-- 샘플 3
create or replace procedure scott.p4(a scott.emp.empno%type)
is
    type emp_sal_table_type is table of scott.emp.sal%type
    index by pls_integer;
   
    emp_sal_tab emp_sal_table_type;
begin
    select sal bulk collect
    into emp_sal_tab
    from scott.emp
    where deptno = a
    order by sal desc;
   
    for i in emp_sal_tab.first..emp_sal_tab.last
    loop
        dbms_output.put_line(emp_sal_tab(i));
    end loop;
end;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
반응형

+ Recent posts