본문 바로가기
DataBase/Oracle

PL/SQL) 자료형 종류 및 변수 종류 (스칼라 변수, 참조 변수 - %type, %rowtype, record)

by 박채니 2022. 5. 2.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


PL/SQL 자료형과 변수

자료형 종류

: SQL 자료형을 모두 포함 + 확장된 형태의 자료형도 제공

1) 기본 자료형
    - 문자형 : char, varchar2, long, clob, ...
    - 숫자형 : number, binary_integer, pls_integer
    - 날짜형 : date, timestamp
    - 논리형 : boolean (true, false, null)

2) 복합 자료형
    - record
    - cursor
    - collection : varry(배열), nested table(자바List), associative array(자바Map)

https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/plsql-data-types.html#GUID-C3B938C9-7B0B-4AAC-8323-FEB2ED0225D0

 

Database PL/SQL Language Reference

Every PL/SQL constant, variable, parameter, and function return value has a data type that determines its storage format and its valid values and operations.

docs.oracle.com

SQL과 PL/SQL의 자료형 크기가 상이한 것을 확인할 수 있습니다.

 

변수 종류

1) 스칼라 변수 : 단일 값 처리, 자료형 직접 지정
2) 참조 변수 : 다른 테이블의 컬럼 타입 참조
3) 상수

 


스칼라 변수

declare
    user_name varchar2(20) := '홍길동';    -- 변수 선언과 동시에 대입(:=)
    n number;
    today date := sysdate;
    bool boolean;
    age constant number := 20;  -- 값 변경 불가한 상수
begin
    dbms_output.put_line('user_name : ' || user_name);
    dbms_output.put_line('n : ' || n);    -- '' (null)
    dbms_output.put_line('today : ' || today);
--    dbms_output.put_line(bool);
    -- PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
    dbms_output.put_line('age : ' || age);
end;
/

boolean타입은 dbms_output.put_line을 이용하여 값을 출력할 수 없습니다.

또한, 변수 n의 경우 현재 아무런 값이 대입 되지 않았으므로 '' null이 출력 되었습니다.

 

declare
    user_name varchar2(20) := '홍길동';    -- 변수 선언과 동시에 대입(:=)
    n number;
    today date := sysdate;
    bool boolean;
    age constant number := 20;  -- 값 변경 불가한 상수
begin
    -- 상수 변경 불가!!!
--    age := 30;
    -- PLS-00363: expression 'AGE' cannot be used as an assignment target
    
    n := 10 + 20;
    dbms_output.put_line('n : ' || n);    -- '' (null)
    
    bool := age > 10;
    if bool then 
        dbms_output.put_line('참참'); -- true일 때 실행 구문
    else
        dbms_output.put_line('거짓거짓');   -- false일 때 실행 구문
    end if;
end;
/

상수인 age를 변경하려고 하니 

"PLS-00363: expression 'AGE' cannot be used as an assignment target" 해당 오류 메세지가 뜨면서 변경이 불가하였습니다.


참조 변수

☞ %type

- 기존 테이블을 컬럼 단위로 참조

declare
    -- 타입을 직접 지정하지 않고, emp_name의 타입을 가져와 씀
    v_emp_name employee.emp_name%type;
    v_phone employee.phone%type;    
begin
    select
        emp_name, phone
    into
        v_emp_name, v_phone
    from
        employee
    where
        emp_id = '&사번';
        
    dbms_output.put_line('사원명 : ' || v_emp_name);
    dbms_output.put_line('전화번호 : ' || v_phone);
end;
/

사번 203 입력!

 

☞ %rowtype

- 기존 테이블을 행 단위로 참조

declare
    erow employee%rowtype;
begin
    select
        *
    into
        erow
    from
        employee
    where
        emp_id = '&사번';
        
    dbms_output.put_line('사원명 : ' || erow.emp_name);
    dbms_output.put_line('이메일 : ' || erow.email);
    dbms_output.put_line('급여 : ' || erow.salary || '원');
end;
/

행의 모든 컬럼 타입을 erow에 담고, employee 테이블의 조회된 사번의 모든 행을 erow에 담아 필요한 정보만 골라서 출력할 수 있습니다.

 

☞ record

- 커스터마이징된 컬럼 타입 모음

declare
    -- 자료형 생성
    type myemptype is record(
        v_emp_name employee.emp_name%type,
        v_dept_title department.dept_title%type,
        v_job_name job.job_name%type
    );
    
    -- 변수명 자료형
    myemprow myemptype;
    
begin
    select 
        emp_name,
        (select dept_title from department where dept_id = e.dept_code),
        (select job_name from job where job_code = e.job_code)
    into myemprow
    from employee e
    where emp_id = '&사번';
    
    dbms_output.put_line('사원명 : ' || myemprow.v_emp_name);
    dbms_output.put_line('부서명 : ' || myemprow.v_dept_title);
    dbms_output.put_line('직급명 : ' || myemprow.v_job_name);   
end;
/

into myemprow에 select된 순서대로 값이 들어가게 되어 해당 값들을 꺼내어 출력할 수 있습니다.

레코드를 이용하여 자료형을 생성!