DATABASE/SQL, PL-SQL
데이터 타입 상세 소개 - 2
devstep88
2021. 1. 19. 22:24
PL/SQL 전용 데이터 타입
PL/SQL 전용 수치형 데이터 타입
PL/SQL에서는 SQL 데이터 타입인 NUMBER와는 다른 저장형식의 정수형 데이터 타입으로 PLS_INTEGER와 BINARY_INTEGER를 PL/SQL 전용 수치형 데이터 타입으로 제공한다. PLS_INTEGER 타입과 BINARY_INTEGER 타입은 이름은 다르지만 완전히 동일한 데이터 타입이다.
데이터 타입 | 설명 |
PLS_INTEGER | CPU에서 지원하는 4바이트 정수와 호환되는 정수로, 다음 여섯 가지 수치형 데이터 타입의 베이스타입이다. BINARY_INTEGER라고도 한다. |
NATURAL | 음수가 아닌(0 이상의) 자연수 |
NATURALN | NOT NULL 제약 조건을 가지는 음수가 아닌(0 이상의) 자연수 |
POSITIVE | 양의 자연수 |
POSITIVEN | NOT NULL 제약조건을 가지는 양의 자연수 |
SIGNTYPE | -1, 0, 1의 세 값 중 하나만을 가질 수 있는 정수로 프로그램에서 부호로 사용하기 적합 |
SIMPLE_INTEGER | NOT NULL 제약조건을 가지는 정수. CPU에서 지원하는 4바이트 정수와 완전히 동일한 데이터 타입으로 PLS_INTEGER의 서브타입 중에서 계산속도가 가장 빠른 타입 |
PLS_INTEGER의 서브타입 중 SIMPLE_INTEGER 타입이 속도가 가장 빠르지만 오버플로우와 언더플로우 체크를 하지 않으므로 사용하는 데에 주의가 필요하다.
DECLARE
v_simple_int SIMPLE_INTEGER := 2147483647; -- SIMPLE_INTEGER 타입의 가장 큰 값
BEGIN
DBMS_OUTPUT_PUT_LINE('정수 최대값: ' || v_simple_int);
v_simple_int := v_simple_int + 1; -- 오버플로우되어 SIMPLE_INTEGER 타입의 가장 작은 값이 됨
DBMS_OUTPUT_PUT_LINE('오버플로우: ' || v_simple_int);
v_simple_int := v_simple_int - 1; -- 다시 언더플로우되어 SIMPLE_INTEGER타입의 가장 큰 값이 됨
DBMS_OUTPUT_PUT_LINE('언더플로우: ' || v_simple_int);
END;
정수 최대값: 2147483647
오버플로우: -2147483648
언더플로우: 2147483647
BOOLEAN 데이터 타입
BOOLEAN 데이터 타입은 TRUE, FALSE와 같은 논리값 또는 NULL을 저장할 수 있는 데이터 타입이다.
BOOLEAN 데이터 타입의 초깃값을 지정하거나 변수에 값을 할당할 때 사용되는 값은 이 세가지 값 중 하나이거나 결과가 BOOLEAN 값인 계산식이어야 한다.
DECLARE
v_bool BOOLEAN; --BOOLEAN 타입변수 선언, 초기값은 NULL
v_true BOOLEAN := TRUE; -- 초기값이 TRUE인 변수 선언
v_false CONSTANT BOOLEAN := FALSE; -- 초기값이 FALSE인 BOOLEAN형 상수 선언
BEGIN
v_bool := (2 < 3); -- 결과가 BOOLEAN 값인 계산식
END;
BOOLEAN 데이터 타입은 다음과 같은 제약 사항을 가진다.
- 대응되는 SQL 데이터 타입이 없으므로 테이블에 저장할 수 없다.
- SQL 내장 함수에 사용할 수 없다.
- SQL문에 사용할 수 없다. 단 BOOLEAN 타입을 사용하는 저장 서브프로그램 또는 익명 PL/SQL 프로그램에서는 사용할 수 있다.
- BOOLEAN 타입의 변수에는 SELECT INTO 또는 FETCH INTO를 사용하여 값을 저장할 수 없다.
- BOOLEAN 데이터 타입은 DBMS_OUTPUT_PUT 또는 PUT_LINE 함수를 사용하여 값을 출력할 수도 없다.
- 출력하려면 CASE 표현식을 사용하거나 IF문을 사용하여 출력해야 한다.
CREATE OR REPLACE FUNCTION boolean_string(a_boolean BOOLEAN) RETURN VARCHAR2
IS
BEGIN
RETURN CASE WHEN a_boolean = TRUE THEN 'TRUE'
WHEN a_boolean = FALSE THEN 'FALSE'
WHEN a_boolean IS NULL THEN 'NULL'
END;
END;
사용자 정의 서브타입
사용자 정의 서브타입은 베이스 타입(기존 데이터 타입)에 제약조건을 추가하여 이를 새로운 데이터 타입으로 정의할 수 있도록 해준다. 서브타입은 값의 제약이 있는지 여부에 따라 두 가지 유형으로 구분된다.
- 제약 없는 서브타입: 베이스 타입과 동일한 데이터를 가질 수 있는 타입으로 실질적으로 베이트 타입의 다른 이름이다.(베이스 타입과 100% 호환된다.)
SUBTYPE 서브타입명 IS 베이스 타입
- 제약을 가진 서브타이비 베이스 타입의 부분 집합이 되는 서브타입. 베이스 타입에 크기, 정밀도, 범위에 대한 제약을 주어 생성한다.
SUBTYPE 서브타입명 IS 베이스타입
[ { 정밀도 [, 스케일] | RANGE 최솟값 ... 최댓값 } ] [NOT NULL ]
-예제
SUBTYPE 정수 IS PLS_INTEGER; -- 제약 없는 서브타입
SUBTYPE 이름 IS VARCHAR2(20 CHAR) NOT NULL; -- 크기와 NOT NULL 제약을 가진 서브타입
v_name 이름 := 'SCOTT'; -- NOT NULL이므로 초깃값을 지정하지 않으면 오류 발생
SUBTYPE 등급 IS PLS_INTEGER RANGE 1000...9999; -- 범위 제약을 가지는 서브타입(네 자리 자연수만 유효)
객체 타입
오라클 PL/SQL 전용이 아닌 DDL을 사용하여 스키마 레벨에서 정의되는 타입
사용자 정의 타입이며 ADT(추상 데이터 타입)라고도 불린다.
객체 타입을 사용하면 데이터베이스에서 상속, 데이터 은닉, 다형성, 객체의 데이터베이스 저장과 같은 기능을 사용하는 객체 지향형 프로그래밍이 가능하다.