tbPSM 문법

tbPSM 프로그램을 작성하기 위해 필요한 tbPSM 문장의 기본적인 문법을 설명합니다.

해당 문법은 다른 프로그래밍 언어에서도 공통적으로 정의하고 있는 내용입니다. 따라서 해당 내용만으로도 충분히 간단한 프로그램을 작성할 수 있습니다.

우선 먼저 식별자(identifier), 분리자(delimiter), 상수(literal) 등과 같은 tbPSM 문장을 작성하는 데 필요한 기본적인 구성요소를 설명하고, 이를 기초로 변수 선언 및 할당 그리고 연산자와 연산식 등을 설명합니다.

tbPSM 문장 구성요소

tbPSM 프로그램은 tbPSM 문장과 SQL 문장으로 구성됩니다.

본 절에서는 tbPSM 문장을 기준으로 설명합니다.

tbPSM 프로그램에서 사용할 수 있는 문자는 다음과 같습니다.

  • 알파벳 문자 : a~z, A~Z

  • 한글 및 기타 유니코드

  • 숫자 : 0~9

  • 기타 문자 : ( ) [ ] { } + - * / < > = ~ ! @ # $ % ^ & ; : . ’ , ” _ | ? tab space 개행문자

하나의 문자 또는 둘 이상이 결합된 문자들이 기호(symbol)를 구성합니다. tbPSM은 이러한 기호를 연산자 나 분리자 등으로 사용하기도 합니다.

식별자

프로그램의 변수, 상수, 레이블, 커서, 함수, 패키지 등과 같은 tbPSM 프로그램의 구성요소는 각각의 이름을 갖고 있습니다. 이러한 이름을 식별자(Identifier)라고 합니다. 식별자는 변수, 커서, 서브 프로그램과 같은 tbPSM 객체의 명명을 위해 사용합니다.

tbPSM의 식별자는 다음과 같은 특징이 있습니다.

  • 알파벳 문자(대문자와 소문자), 한글, 숫자, $, _, #를 사용하여 만듭니다.

  • 알파벳 문자 또는 한글로 시작해야 합니다.

  • 대문자와 소문자를 구분하지 않습니다.

  • 최대 길이는 255bytes입니다.

다음은 유효한 식별자의 예입니다.

반면에 다음은 유효하지 않은 식별자의 예입니다.

또한 tbPSM은 대문자와 소문자를 구별하지 않으므로 다음의 식별자는 모두 같은 의미를 갖습니다.

식별자 사용 예제

tbPSM의 예약어는 SQL 표준에서 정의하고 있는 예약어보다 더 많습니다. tbPSM의 전체 예약어는 “Appendix A. 예약어”를 참고합니다.

식별자에 이러한 tbPSM의 예약어를 지정하여 사용하는 경우는 다음과 같습니다.

  • 예약어를 식별자로 지정한 경우 특별한 의미를 갖는 일부 식별자는 예약어로 지정되어 있습니다. tbPSM은 예약어를 특별한 의미로 사용합니다. 따라서 예약어를 변수와 같이 일반적인 식별자로 지정하면 안됩니다.

BEGIN 예약어를 식별자로 지정하면 컴파일 에러가 발생합니다.

  • 예약어를 식별자의 일부로 지정한 경우

BEGIN 예약어를 식별자 이름의 일부로 지정하는 경우라면 사용할 수 있습니다.

다음은 식별자에 큰따옴표(" ")를 지정하여 사용하는 예입니다.

식별자는 일반적으로 공백 문자나 탭 등의 문자를 포함할 수 없으며 대소문자 구분을 하지 않습니다. 그러나 특별히 이런 특징에 예외가 되는 식별자를 사용해야 하는 경우에는 큰따옴표로 식별자를 묶어 사용할 수 있습니다.

큰따옴표로 감싼 식별자의 최대 길이는 일반적인 식별자의 길이와 같은 255bytes이며, 감싼 부분에는 tbPSM의 문자를 모두 사용할 수 있습니다. 이러한 예는 tbPSM의 예약어를 식별자로 지정하여 사용할 때에도 매우 유용합니다.

다음은 큰따옴표를 사용하여 RECORD 예약어를 식별자로 사용하는 예입니다.

위의 예에서 보듯이 테이블의 컬럼 이름은 데이터베이스에 저장될 때 대문자로 저장됩니다. 따라서 큰따옴 표로 감싼 식별자를 SQL 질의에서 사용할 때에는 반드시 대문자를 사용해야 합니다.

분리자

분리자는 식별자를 구분하기 위해 사용합니다. 일부 분리자는 연산자의 역할도 수행합니다.

다음은 tbPSM의 분리자를 요약한 목록입니다.

기호
의미

+

덧셈

-

뺄셈

*

곱셈

/

나눗셈

=

등호

<

부등호(보다 작다)

>

부등호(보다 크다)

(

괄호(왼쪽)

)

괄호(오른쪽)

기호
의미

;

문장의 끝 표시

%

속성 표시

,

항목 구분

.

컴포넌트 구분

@

데이터베이스 링크 표시

문자열 분리자

인용된 문자열 분리자

:

바인드 변수 표시

**

지수

<>

같지 않다.

!=

같지 않다.

~=

같지 않다.

^=

같지 않다.

<=

크지 않다(보다 작거나 같음).

>=

작지 않다(보다 크거나 같음).

:=

대입

..

범위

||

문자열 결합

<<

레이블(왼쪽)

>>

레이블(오른쪽)

--

단일 라인 주석

/*

다중 라인(왼쪽)

*/

다중 라인(오른쪽)

상수

하나 또는 그 이상의 문자를 사용하여 어떤 값 자체를 표현하는 경우를 상수(literal)라 합니다. 상수는 한 번 표시되면 변하지 않는다는 특성이 있습니다. 상수는 숫자 상수, 문자 상수, 문자열 상수, 날짜 상수, 진리(boolean)상수 등으로 분류됩니다.

주석

주석(comment)은 tbPSM이 인식하지 않는 문자열로, 단일 라인 주석과 다중 라인 주석으로 설정이 가능합니다. 단일 라인과 다중 라인의 주석은 한 프로그램에서 함께 사용할 수 있습니다.

  • 단일 라인 주석 기본적인 tbPSM의 주석은 '--'로 시작하고, 최초로 만나는 개행문자로 끝납니다. 다음은 단일 라인으로 설정한 주석의 예입니다.

  • 다중 라인 주석 C 프로그래밍 언어에서 사용하는 주석도 사용할 수 있습니다. 이 주석은 여러 줄에 걸쳐 사용할 수 있으며, /*...*/의 형식으로 사용합니다. 단, 중첩하여 사용할 수 없습니다. 다음은 다중 라인으로 설정한 주석의 예입니다.

tbPSM 데이터 타입

tbPSM의 데이터 타입은 스칼라(scalar), 복합(composite), 참조(reference), 대용량 객체형(LOB) 등의 타입으로 분류할 수 있습니다.

복합 타입은 몇 개의 필드로 이루어지며, 각 필드는 스칼라 타입에 속하는 데이터입니다. 참조 타입은 다른 타입에 대한 포인터이며, 대용량 객체형은 대용량 객체(Large object)를 지원하기 위한 타입입니다.

tbPSM의 데이터 타입 중에는 특정 데이터 타입을 기반으로 정의되는 타입이 있습니다. 이를 서브 타입(subtype) 이라 합니다. 서브 타입은 기반이 되는 데이터 타입에 대한 연산(operation)은 변경하지 않으며, 다만 기반이 되는 데이터 타입의 값에 제약을 부여하여 생성합니다.

또한 사용자는 필요에 따라 기존의 데이터 타입에 기반하여 새로운 서브 타입을 정의할 수 있습니다. 이를 칭할 때 사용자 정의 서브 타입이라 합니다. 자세한 내용은 “2.2.6. 사용자 정의 서브 타입”을 참고합니다.

다음은 타입 별 tbPSM의 데이터 타입입니다.

  • 스칼라 타입

그룹
서브 타입

NUMERIC

NUMBER, DEC, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INT, NATURAL, NATURALN, NUMERIC, REAL, POSITIVE, POSITIVEN, SMALLINT, SIGNTYPE, PLS_INTEGER, BINARY_INTEGER, BINARY_FLOAT, BINARY_DOUBLE

CHARACTER / STRING

VARCHAR2, VARCHAR, CHAR, CHARACTER, LONG, STRING, RAW, ROWID, LONG RAW, NCHAR, NVARCHAR

DATETIME / INTERVAL

DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

BOOLEAN

BOOLEAN

  • 복합 타입

그룹
서브 타입

-

RECORD, VARRAY, TABLE

  • 참조 타입

그룹
서브 타입

-

REF CURSOR

  • 대용량 객체형 타입

그룹
서브 타입

-

CLOB, BLOB, XMLTYPE, GEOMERTY, BFILE, JSON

  • 기타 타입

그룹
서브 타입

-

%TYPE, %ROWTYPE

스칼라 타입

스칼라 타입은 데이터 그대로 사용하거나 또는 간단한 타입의 변화를 통해 데이터베이스 테이블의 컬럼에 저장할 수 있는 데이터 타입을 말합니다. 스칼라 타입은 데이터의 종류에 따라 NUMERIC, CHARACTER, DATETIME, BOOLEAN 그룹으로 나뉩니다.

NUMERIC 그룹

NUMERIC 그룹의 데이터 타입은 정수나 실수 값을 표현합니다.

  • NUMBER 이 타입은 부동소수점 숫자를 표현하며, 데이터베이스에서 사용하는 NUMBER 타입과 동일합니다. 선언하는 문법은 다음과 같습니다.

옵션
설명

P

정밀도를 의미

다음은 정밀도의 특징

  • 값의 자릿수

  • 단독으로 사용할 수 있음

  • 최대 자릿수는 38

S

스케일을 의미

다음은 스케일의 특징

  • 소수점 오른쪽 자릿수

  • 단독으로 사용할 수 없음

  • 최대 자릿수는 127

NUMBER의 서브 타입은 다음과 같습니다.

서브 타입
설명

DEC

NUMBER 타입과 동일

DECIMAL

NUMBER 타입과 동일

DOUBLE PRECISION

정밀도와 스케일을 명시할 수 없음

FLOAT

스케일을 명시할 수 없음

INTEGER

최대 38자리의 정수만 허용

INT

최대 38자리의 정수만 허용

NUMERIC

NUMBER 타입과 동일

REAL

스케일을 명시할 수 없음

SMALLINT

최대 38자리의 정수만 허용

  • BINARY_INTEGER 정수만을 표현하기 위해 지원되는 데이터 타입입니다. BINARY_INTEGER는 -2^31 ~ 2^31 - 1사이의 값을 갖는 부호를 포함하는 정수 값을 표현하기 위해 사용됩니다. BINARY_INTEGER는 바이너리 형식으로 저장됩니다.

BINARY_INTEGER의 서브 타입은 다음과 같습니다.

서브 타입
설명

NATURAL

N >= 0인 정수만 허용

NATURALN

NULL을 대입할 수 없음

POSITIVE

POSITIVE는 N > 0인 정수만 허용

POSITIVEN

NULL을 대입할 수 없음

SIGNTYPE

-1, 0, 1의 값만 허용

  • BINARY_FLOAT / BINARY_DOUBLE 부동소수점 실수를 표현하고, 빠른 계산을 위해 사용됩니다.

선언하는 문법은 다음과 같습니다.

  • PLS_INTEGER BINARY_INTEGER 타입과 동일한 범위(-2^31 ~ 2^31 - 1)를 가집니다.

CHARACTER / STRING 그룹

CHARACTER 그룹의 데이터 타입은 문자나 문자열 값을 표현합니다.

  • VARCHAR2 데이터베이스에서 사용하는 VARCHAR2 타입과 유사합니다. 선언하는 문법은 다음과 같습니다.

항목
설명

L

변수의 최대 길이

  • 가변 길이 문자열을 저장

  • 항상 표시되어야 함

  • 길이는 문자가 아니라 Byte로 지정됨

  • 최대 길이는 32767bytes

  • 실제 데이터는 ASCII나 EUR-KR, UTF-8 등 데이터베이스의 문자 집합으로 변경되어 저장됨

데이터베이스에서 사용하는 VARCHAR2 타입의 컬럼은 4000bytes만을 저장할 수 있습니다. 따라서 4000bytes 이상인 tbPSM 변수를 VARCHAR2 타입의 데이터베이스 컬럼에 저장할 경우 에러가 발생합니다. VARCHAR2의 서브 타입은 다음과 같습니다.

서브 타입
설명

STRING

VARCHAR2와 같은 크기의 값을 표현할 수 있으며, 타입의 호환을 위해 사용하는 서브 타입

VARCHAR

VARCHAR2와 같은 크기의 값을 표현할 수 있으며, 타입의 호환을 위해 사용하는 서브 타입

  • CHAR 고정 길이 문자열로 문자 데이터를 저장하고 남는 공간을 빈 칸(blank)으로 채웁니다. 빈 칸(blank)으로 채워지기 때문에 같은 문자열이 저장된 변수라도 서로 길이가 다르다면, 이 두 변수를 비교할 때 서로 일 치하지 않는다는 점에 주의해야 합니다. 선언하는 문법은 다음과 같습니다.

옵션
설명

L

변수의 최대 길이

  • 고정 길이 문자열을 저장

  • VARCHAR2와는 달리 길이를 지정하는 것은 옵션 (기본값: 1)

  • 길이는 문자가 아니라 Byte로 지정됨

  • 최대 길이는 32767bytes

데이터베이스에서 사용하는 CHAR 타입의 컬럼은 2000bytes만을 저장할 수 있습니다. CHAR의 서브 타입은 다음과 같습니다.

서브 타입
설명

CHARACTER

CHAR과 같은 크기의 값을 표현할 수 있으며, 타입의 호환을 위해 사용하는 서브 타입

  • NVARCHAR2 데이터베이스에서 사용하는 NVARCHAR2 타입과 유사합니다.

선언하는 문법은 다음과 같습니다.

항목
설명

L

변수의 최대 길이

  • 가변 길이 문자열을 저장

  • 항상 표시되어야 함됨

  • 길이는 항상 문자 단위로 지정

  • 최대 길이는 32767bytes

  • 실제 데이터는 UTF8이나 UTF16 등 데이터베이스의 다국어 문자 집합으로 변경되어 저장됨

데이터베이스에서 사용하는 NVARCHAR2 타입의 컬럼은 4000bytes만을 저장할 수 있습니다. 따라서 4000bytes 이상인 tbPSM 변수를 NVARCHAR2 타입의 데이터베이스 컬럼에 저장할 경우 에러가 발생합니다.

NVARCHAR2의 서브 타입은 다음과 같습니다.

서브 타입
설명

NVARCHAR

NVARCHAR2와 같은 크기의 값을 표현할 수 있으며, 타입의 호환을 위해 사용 하는 서브 타입

  • NCHAR 고정 길이 문자열로 문자 데이터를 저장하고 남는 공간을 빈 칸(blank)으로 채웁니다. 빈칸(blank)으로 채워지기 때문에 같은 문자열이 저장된 변수라도 서로 길이가 다르다면, 이 두 변수를 비교할 때 서로 일 치하지 않는다는 점에 주의해야 합니다. 선언하는 문법은 다음과 같습니다.

옵션
설명

L

변수의 최대 길이

  • 고정 길이 문자열을 저장

  • NVARCHAR2와는 달리 길이를 지정하는 것은 옵션(기본값: 1)

  • 길이는 항상 문자 단위로 지정됨

  • 최대 길이는 32767bytes

데이터베이스에서 사용하는 NCHAR 타입의 컬럼은 2000bytes만을 저장할 수 있습니다.

  • LONG 2GB(2^31)까지의 데이터를 저장할 수 있는 데이터베이스의 LONG 타입과는 달리 32760bytes의 최대 길이를 갖는 가변 길이 문자열입니다. LONG 타입은 VARCHAR2 타입과 매우 유사합니다. LONG 타입의 데이터베이스의 컬럼은 32760bytes 이상의 데이터를 저장할 수 있기 때문에 tbPSM의 LONG 타입으로는 LONG 타입의 데이터베이스 컬럼값을 저장하는데 제약이 따릅니다. 하지만 tbPSM의 LONG 타입의 최대 길이는 데이터베이스에서 사용하는 LONG 타입보다 작으므로 제한없이 데이터베이스 컬럼에 삽입할 수 있습니다.

  • RAW 이 타입은 바이너리 데이터를 저장하기 위한 고정길이 문자열입니다.

선언하는 문법은 다음과 같습니다.

항목
설명

L

변수의 최대 길이

  • 고정 길이 문자열을 저장

  • 항상 표시되어야 함

  • 길이는 문자가 아니라 Byte로 지정됨

  • 최대 길이는 32767bytes

데이터베이스에서 사용하는 RAW 타입의 컬럼은 2000bytes만을 저장할 수 있습니다. 따라서 만일 데이터의 길이가2000bytes 이상이면 RAW 타입의 데이터베이스 컬럼에 저장될 수 없습니다. 그러나 최대 길이가 2GB(2^31)인 LONG RAW 타입의 데이터베이스 컬럼에는 삽입될 수 있습니다.

LONG RAW 타입의 데이터베이스 컬럼에 저장된 데이터의 길이가 32767bytes 이상이라면 tbPSM의 RAW 타입의 변수에 저장될 수 없습니다.

  • LONG RAW 이 타입은 바이너리 데이터 또는 Byte로 된 문자열을 저장하기 위해 사용하는 자료 구조입니다.

선언하는 문법은 다음과 같습니다.

항목
설명

L

변수의 최대 길이

  • 항상 표시되어야 함

  • 길이는 문자가 아니라 Byte로 지정됨

  • 최대 길이는 32760bytes

데이터베이스에서 사용하는 LONG RAW 타입의 컬럼은 최대 길이가 2GB이기 때문에 컬럼 데이터의 실제 길이가 32760bytes 이상이라면 tbPSM의 LONG RAW 타입의 변수에 저장될 수 없습니다. 반면에 tbPSM의 LONG RAW 타입의 컬럼의 최대 길이보다 작으므로 저장에 제한이 없습니다.

  • ROWID 이 타입은 기본적으로 데이터베이스의 ROWID 타입과 같습니다. ROWID는 내부적으로 운영체제에 따라 길이가 다른 고정 길이 2진수로 저장됩니다. 일반적으로 ROWID는 tbPSM 프로그램에 의해 구성되지 않습니다. ROWID는 ROWIDTOCHAR 내장 함수를 통해 문자열로 변환할 수 있습니다. 이 함수를 통해 출력된 결과 값은 총 18자리 문자열로 나타납니다.

항목
설명

SSSSSS

데이터베이스의 세그먼트

FFF

데이터 파일의 번호

BBBBBB

데이터베이스의 블록

RRR

블록 내의 로우

ROWID의 각 구성요소는 16진수로 표현될 수 있습니다.

다음은 파일 1의 1번 세그먼트의 첫 번째 블록의 첫 번째 열을 의미하는 ROWID의 예입니다.

DATETIME / INTERVAL 그룹

년, 월, 일, 시, 분, 초를 포함하는 날짜 및 시간 정보를 저장하기 위해 사용합니다.

  • DATE 변수는 고정 길이의 날짜 정보를 저장합니다. DATE 타입의 포맷은 초기화 파라미터인 NLS_DATE_FORMAT에 의해 결정됩니다. (기본값: 'YYYY/MM/DD')

다음은 DATE 타입을 사용한 예입니다.

Tibero에서 제공하는 SYSDATE 함수는 현재 날짜를 반환합니다.

  • TIMESTAMP 변수는 DATE 타입을 확장하여 시간 정보까지 저장합니다.

선언하는 방법은 다음과 같습니다.

옵션
설명

P

소수점 초 단위의 정밀도

  • 0 ~ 9사이의 값을 사용할 수 있음 (기본값: 6)

  • TIMESTAMP 타입의 포맷인 초기화 파라미터 NLS_TIMESTAMP_FORMAT에 의해 결정됨

다음은 TIMESTAMP 타입을 사용한 예입니다.

  • TIMESTAMP WITH TIME ZONE TIMESTAMP 타입을 확장하여 시간대 정보까지 저장합니다.

선언하는 방법은 다음과 같습니다.

옵션
설명

P

소수점 초 단위의 정밀도

  • 0 ~ 9사이의 값을 사용할 수 있음(기본값: 6)

  • TIMESTAMP WITH TIME ZONE 타입의 포맷인 초기화 파라미터 NLS_ TIMESTAMP_TZ_FORMAT에 의해 결정됨

다음은 TIMESTAMP WITH TIME ZONE 타입을 사용한 예입니다.

  • TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMP 타입을 UTC(Coordinated Universal Time)으로 정규화해서 저장합니다.

선언하는 방법은 다음과 같습니다.

옵션
설명

P

소수점 초 단위의 정밀도

  • 0 ~ 9사이의 값을 사용할 수 있음(기본값: 6)

  • TIMESTAMP 타입의 포맷인 초기화 파라미터 NLS_TIMESTAMP_FORMAT에 의해 결정됨

다음은 TIMESTAMP WITH LOCAL TIME ZONE 타입을 사용한 예입니다.

  • INTERVAL YEAR TO MONTH 연도와 월의 차이를 저장합니다.

선언하는 방법은 다음과 같습니다.

옵션
설명

P

  • 연도의 자릿수를 결정

  • 0 ~ 4 사이의 값을 사용할 수 있음(기본값: 2)

다음은 INTERVAL YEAR TO MONTH 타입을 사용한 예입니다.

  • INTERVAL DAY TO SECOND 날짜와 초의 차이를 저장합니다.

선언하는 방법은 다음과 같습니다.

옵션
설명

P

  • 날짜의 자릿수를 결정합니다

  • 0 ~ 9 사이의 값을 사용할 수 있음(기본값: 2)

F

  • 초의 자릿수를 결정

  • 0 ~ 9 사이의 값을 사용할 수 있음 (기본값: 6)

다음은 INTERVAL DAY TO SECOND 타입을 사용한 예입니다.

BOOLEAN 그룹

TRUE, FALSE, NULL 만을 저장할 수 있습니다.

다음은 유효하지 않은 BOOLEAN를 사용한 예입니다.

복합 타입

tbPSM에서 사용할 수 있는 복합 타입(composite type)은 컬렉션 타입(테이블, 배열)과 레코드가 있습니다. 복 합 타입은 내부에 하나 이상의 스칼라 타입을 포함해야 합니다. 자세한 내용은 “제4장 복합 타입”을 참고합니다.

참조 타입

프로그램에서 변수가 일단 스칼라나 복합 타입으로 선언되면 참조 타입의 변수에 메모리 저장소가 할당됩니다. 변수에 할당된 메모리 저장소는 나중에 프로그램에서 참조를 위해 사용됩니다. 그러나, 일단 변수에 메모리 저장소가 할당이 되면 해제할 방법은 없으며, 계속 그 변수를 사용할 수 밖에 없습니다. 즉, 메모리 저장소는 변수가 소멸되기 전까지는 해제되지 않습니다.

그러나 참조 타입은 이러한 제한이 없습니다. tbPSM에서 참조 타입은 C 언어의 포인터와 같습니다. 참조 타입으로 선언된 변수는 다른 저장소의 위치를 가리킵니다. 현재 tbPSM에서 사용할 수 있는 참조 타입은 REF CURSOR입니다. 자세한 내용은 “커서 변수”를 참고합니다.

대용량 객체형 타입

대용량 객체형 타입은 CLOB, BLOB, XMLTYPE, GEOMETRY, BFILE, JSON이 있습니다.

  • CLOB 대용량의 문자열 데이터를 저장합니다. CLOB 타입으로 문자열이 저장될 때는 항상 고정길이의 문자 집합으로 변환됩니다. 최댓값은 4GB(2^64bytes)까지 가능하며, DBMS_LOB 패키지를 이용하여 조작할 수 있습니다.

  • BLOB 대용량의 바이너리 데이터를 저장합니다. 최댓값은 4GB(2^64bytes)까지 가능하며, DBMS_LOB 패키지를 이용하여 조작할 수 있습니다.

  • XMLTYPE XML형태의 데이터를 저장합니다. 물리적으로 CLOB 타입과 동일합니다.

  • GEOMERY GEOMERY 형태의 데이터를 저장합니다. 물리적으로 BLOB 타입과 동일합니다.

  • BFILE File Locator로써, 파일 접근을 위한 파일 경로와 파일이름을 저장하고 있는 타입니다. 데이터베이스 외 부의 파일을 접근하기 위함이며, 최대 4GB 크기의 파일을 접근 가능합니다.

  • JSON JSON 형태의 데이터를 저장합니다. 물리적으로 BLOB 타입과 동일합니다.

기타 타입

데이터베이스 테이블에 저장된 데이터를 조작하기 위해 사용하는 tbPSM 변수는 테이블 컬럼과 같은 타입을 가지고 있어야 하며, 해당 컬럼의 타입이 변경되더라도 프로그램에 영향을 미치지 않아야 합니다.

다음과 같은 기타 타입의 변수가 사용됩니다.

  • %TYPE 어떤 테이블 컬럼 하나와 동일한 타입을 갖습니다. 예를 들어 students 테이블의 first_name 컬럼은 VAR CHAR2(20) 타입을 가지고 있습니다고 가정하면 다음과 같이 변수를 선언할 수 있습니다.

만약 first_name 컬럼의 정의가 VARCHAR2(25) 타입으로 변경되면 이 컬럼을 사용하는 모든 코드는 변경되어야 합니다. 이때 %TYPE을 사용할 수 있습니다. 테이블 컬럼과 연동되어 해당 타입을 반환합니다.

예를 들면 다음과 같습니다.

%TYPE를 사용하면 v_first_name 변수는 students 테이블의 first_name 컬럼의 타입과는 관계없이 항상 동일하게 동작합니다. 만일 %TYPE이 NOT NULL로 제한된 변수나 컬럼에 적용되는 경우 반환되는 타입은 이러한 제한을 갖지 않습니다.

  • %ROWTYPE 테이블의 컬럼 전체와 같은 타입을 갖는 레코드 변수처럼 동작합니다. 기본 속성은 %TYPE과 동일합니다.

사용자 정의 서브 타입

사용자는 필요에 따라 기존의 데이터 타입에 기반하여 새로운 서브 타입을 정의할 수 있습니다. 이를 칭할 때 사용자 정의 서브 타입이라고 합니다.

선언하는 방법은 다음과 같습니다.

옵션
설명

new_type

새롭게 선언할 서브 타입의 이름

orig_type

  • 미리 정의된 타입이거나 서브 타입 또는 %TYPE일 수 있음

  • 새롭게 선언된 서브 타입(new_type)은 orig_type에 따라 해당 그룹에 속하게 됨

예를 들면 orig_type를 %TYPE으로 선언하는 경우 tbPSM 블록의 선언부에 정의될 수 없습니다. 하지만 다음 과 같이 더미(dummy) 변수를 선언한 후 이 변수를 이용하여 서브 타입을 선언할 수 있습니다.

다음은 사용자 정의 서브 타입의 예입니다.

위 예에서는 NUMBER 타입에 기반한 새로운 서브 타입 즉 Single이 선언되었습니다.

서브 타입의 선언은 항상 tbPSM 블록의 선언부에 포함되어야 하며, 서브 타입을 사용하기 전에 선언되어야 합니다.만약 서브 타입의 변수가 갖지 못하는 값을 할당하면 예외 상황이 발생합니다.

서브 타입은 이미 존재하는 데이터 타입에 기초한 tbPSM의 타입이므로 애플리케이션 프로그램 개발자의 편의나 프로그램의 이해를 높이기 위한 별칭(Alias)으로도 사용할 수 있습니다. 또한 미리 정의된 서브 타입 외에 새로운 서브 타입을 정의할 수 있습니다.

예를 들면 다음과 같습니다.

데이터 타입 변환

tbPSM은 스칼라 타입 중에서 다른 그룹 사이의 변환을 처리할 수 있습니다. 그룹 내에서의 변수의 제한을 제외하면 제한 없이 데이터 타입을 변경할 수 있습니다.

예를 들면 CAHR(10) 데이터 타입은 충분한 공간이 없기 때문에 VARCHAR(1)로 변환할 수 없습니다. 마찬가지로 정밀도와 스케일의 제약은 NUMBER(3)를 NUMBER(3,2)로 변환을 방해합니다. 이렇게 변수에 제약이 있으면 컴파일러는 에러를 발생시키지 않습니다. 그 대신 런타임 에러가 발생합니다.

일반적으로 혼합된 데이터 타입은 변환 자체가 금지됩니다. 그러나 변환이 필요하면 변환 함수를 작성하여 프로그램에서 사용할 수 있습니다.

데이터 타입을 변환하는 방법에는 다음과 같이 두 가지가 있습니다.

  • 명시적(explicit) 변환

  • 묵시적(implicit) 변환

명시적 변환

명시적 변환은 시스템 변환 함수와 CAST 구문을 사용하여 변환하는 것을 말합니다. 다음은 시스템에서 제공하는 변환 함수입니다.

구분
설명

TO_CHAR

데이터를 VARCHAR2 타입으로 변환

변환이 가능한 타입은 다음과 같음

  • NUMERIC 그룹

  • RAW, LONG RAW를 제외한 CHARACTER / STRING 그룹

  • DATETIME / INTERVAL 그룹

  • ROWID

  • CLOB

TO_DATE

입력 데이터를 DATE 타입으로 변환

단, 입력 데이터가 DATE 형식으로 되어 있지 않은 경우에는 예외 상황이 발생

변환이 가능한 타입은 다음과 같음

  • RAW, LONG RAW를 제외한 CHARACTER / STRING 그룹

  • CLOB

TO_CLOB

입력 데이터를 CLOB 타입으로 변환 변환이 가능한 타입은 다음과 같음

  • NUMERIC 그룹

  • RAW, LONG RAW를 제외한 CHARACTER / STRING 그룹

  • DATETIME / INTERVAL 그룹

  • ROWID

TO_TIMESTAMP

입력 데이터를 TIMESTAMP 타입으로 변환

단, 입력 데이터가 TIMESTAMP 형식으로 되어 있지 않은 경우에는 예외 상황이 발생

변환이 가능한 타입은 다음과 같음

  • RAW, LONG RAW를 제외한 CHARACTER / STRING 그룹

  • CLOB

TO_NUMBER

입력 데이터를 NUMBER 타입으로 변환

단, 입력 데이터가 NUMBER 형식으로 되어 있지 않은 경우에는 예외 상황이 발생

변환이 가능한 타입은 다음과 같음

  • RAW, LONG RAW를 제외한 CHARACTER / STRING 그룹

  • CLOB

RAWTOHEX

바이너리 데이터를 16진수 표현으로 변환 변환이 가능한 타입은 다음과 같음

  • RAW, LONG RAW

HEXTORAW

16진수 표현을 동일한 바이너리 데이터로 변환 변환이 가능한 타입은 다음과 같음

  • 16진수 표현으로 되어 있으며 VARCHAR2로 변환될 수 있는 타입

CHARTOROWID

ROWID 형식으로 된 문자열 변수를 ROWID 타입으로 변환 변환이 가능한 타입은 다음과 같음

  • ROWID 형식으로 되어 있으며, VARCHAR2로 변환될 수 있는 타입

ROWIDTOCHAR

ROWID 타입의 변수를 문자열로 변환 변환이 가능한 타입은 다음과 같음

  • ROWID

CAST 구문의 사용법은 다음과 같습니다.

묵시적 변환

묵시적 변환은 변수 사이의 대입 등에서 필요하다고 판단될 경우 자동으로 일어나는 변환을 말합니다.

예를 들면 다음과 같습니다.

위의 예는 emp 테이블에서 ID가 1004번인 직원의 현재 신용 번호를 조회하는 SELECT 문입니다. 그러나 컬럼인 current_credits의 데이터 타입은 NUMBER(3)인 반면에 cur_cred는 VARCHAR2(5)입니다. 이러한 경우 tbPSM은 NUMBER 타입의 데이터를 자동으로 VARCHAR2 타입으로 변환하여 INTO 절에 할당된 cur_cred에 저장합니다.

다음은 묵시적 변환이 허용되는 타입입니다.

BIN_INT
PLS_INT
NUMBER
CHAR
VARCHAR2
LONG
DATE
RAW
CLOB
BLOB
ROWID

BIN_INT

-

O

O

O

O

O

X

X

X

X

X

PLS_INT

O

-

O

O

O

O

X

X

X

X

X

NUMBER

O

O

-

O

O

O

X

X

X

X

X

CHAR

O

O

O

-

O

O

O

O

O

X

O

VARCHAR2

O

O

O

O

-

O

O

O

O

X

O

LONG

O

O

O

O

O

-

O

O

O

X

O

DATE

X

X

X

O

O

O

-

X

X

X

X

RAW

X

X

X

O

O

O

X

-

X

O

X

CLOB

X

X

X

O

O

O

X

X

-

X

X

BLOB

X

X

X

X

X

X

X

O

X

-

X

ROWID

X

X

X

O

O

O

X

X

X

X

-

위 표에서 세로로 표현된 열은 원본 타입이고, 가로로 표현된 행은 대상 타입입니다.

묵시적 변환에서 주의할 점은 다음과 같습니다.

  • VARCHAR2 타입이 DATE 타입으로 변환되는 경우 위 표에서는 변환이 가능한 것으로 되어 있지만, 실제로는 VARCHAR2 타입의 변수가 DATE 형식으로 되어 있지 않으면 예외 상황이 발생합니다.

  • LONG 타입의 변수가 NUMBER 타입으로 변환되는 경우 위 표에서는 변환이 가능한 것으로 되어 있지만, 실제로는 LONG 타입의 변수가 NUMBER 형식으로 되어 있지 않으면 예외 상황이 발생합니다.

특정한 형식을 갖고 있는 타입으로 변환하기 위해서는 원본 변수 역시 같은 형식을 가져야 합니다.

예를 들면 다음과 같습니다.

데이터 변수의 선언과 참조 영역

본 절에서는 데이터 변수의 선언과 참조 영역에 대해서 설명합니다.

변수 선언

데이터 변수를 선언하려면 먼저 변수 이름을 입력하고 그 다음 변수의 데이터 타입을 정의합니다. 이때 변수에 초기 값을 할당할 수 있으며, 상수로 초기 값을 선언할 수도 있습니다.

예를 들면 다음과 같습니다.

위의 예에서 변수 radius는 초기 값으로 1.0을 할당하였으며, 변수 pi는 항상 3.141592654 값을 갖도록 초 기 값을 상수로 선언하였습니다.

데이터 변수에 NOT NULL 제약조건을 설정할 수도 있습니다. NOT NULL 제약조건을 설정하면 변수 값이 NULL이 되어서는 안 됩니다.

만약 NULL이 변수 값으로 할당되면 예외 상황이 발생합니다.

사용자가 필요에 의해 정의한 서브 타입에 대해서도 NOT NULL 제약조건을 설정할 수 있습니다. 이러한 서브 타입의 변수에 NULL를 할당하면 예외 상황이 발생합니다.

변수 참조 영역

변수 참조 영역(scope)은 프로그램의 일부로서, 한 프로그램 내에서 해당 변수에 접근할 수 있는 영역을 의미합니다. tbPSM 변수의 참조 영역은 변수가 선언된 블록입니다. 즉, 변수의 선언에서 시작되고 변수가 선언된 블록이 끝날 때 참조 영역도 끝납니다. 변수가 참조 영역을 벗어나면 해당 변수를 저장하기 위해 할당된 메모리는 시스템에 반환됩니다. 따라서 프로그램이 종료되지 않았어도 참조 영역을 벗어난 변수라면 접근할 수 없습니다.

예를 들면 다음과 같습니다.

<employee_num 변수의 참조 영역>

각 변수의 참조 영역 내에서는 해당 변수와 동일한 이름을 사용할 수 없습니다. 그러나 참조 영역의 내부에 서브 블록이 사용되는 경우는 다릅니다.

아래 예와 같이 서브 블록 안에서는 외부 블록에서처럼 동일한 이름의 변수를 선언하고 사용할 수 있습니다.

위 예를 기준으로 employee 변수의 참조 영역을 설명하면 다음과 같습니다.

ⓐ ~ ⓑ 외부 블록에서 선언된 employee가 사용되는 영역입니다.

ⓒ ~ ⓓ 서브 블록에서 선언된 employee가 사용되는 영역입니다.

ⓔ ~ ⓕ 외부 블록에서 선언된 employee가 사용되는 영역입니다.

서브 블록 내에서는 외부 블록에서 선언된 employee 변수를 사용할 수 없습니다. 사용하고 싶다면 다음 예에서처럼 외부 블록에 레이블을 붙여서 사용해야 합니다.

서브 프로그램의 내부에서 선언된 변수의 경우에도 위와 같은 방법으로 접근합니다.

연산식

tbPSM 프로그램에서는 기본적으로 제공되는 Tibero의 연산식을 그대로 사용합니다. 단, Tibero의 기본 연산식에 포함되지 않는 CASE 연산자가 존재합니다.

CASE 연산자

CASE 연산자는 여러 조건 중에서 만족되는 조건에 연관된 값을 반환하는 연산자입니다.

다음은 CASE 연산자를 사용한 예입니다.

위 예에서 데이터 변수 order에 할당된 값에 따라 변수 name의 값은 달라집니다. 여기에서 변수 order를 선 택자(selector)라고 합니다.

변수 order의 값이 WHEN 문 뒤의 값과 일치하면 THEN 뒤의 값을 CASE 연산자가 반환합니다. 이와는 반 대로 변수 order의 값이 WHEN 뒤의 값 중에 어떤 것과도 일치하지 않으면 ELSE 뒤의 값을 반환합니다.

위의 예를 기준으로 설명하면, order의 값이 1이라면 CASE 연산자는 Mercury를 반환하고, 따라서 name에는 Mercury가 저장됩니다. 이와 마찬가지로 order의 값이 2라면 name에는 Venus가 저장될 것입니다.

또는 선택자 없이 CASE 연산자를 사용할 수도 있습니다. 선택자가 있을 때는 선택자와 WHEN 다음의 값을 비교할 때 동등 연산자(=)로 비교합니다. 하지만 선택자가 없는 경우에는 WHEN 다음에 임의의 논리 연산식이 올 수 있습니다. 예를 들면 다음과 같습니다.

이처럼 선택자가 없으면 변수 order에 좀 더 복잡한 논리 조건을 사용할 수 있습니다.

NULL을 포함하는 연산식의 계산

논리 또는 산술 연산식의 피연산자로 NULL 값이 포함되어 있을 때에는 일반적인 경우와 다르게 연산식을 계산할 수 있습니다.

다음은 논리 연산자의 피연산자가 NULL 값인 경우에 대한 결과입니다.

X
Y
X and Y
X or Y
not X

NULL

TRUE

NULL

TRUE

NULL

NULL

FALSE

FALSE

NULL

NULL

NULL

NULL

NULL

NULL

NULL

비교 연산자의 피연산자가 NULL 값인 경우에는 항상 NULL를 반환합니다. IF 문과 같은 제어 구조에서는 논리 연산식이 NULL을 반환하면 FALSE가 반환된 것처럼 처리됩니다. 만약 특정 변수의 값이 NULL인지를 확인하려면 IS NULL 연산자를 사용합니다.

연산자

가장 기본적인 연산자는 대입(assignment) 연산자입니다.

대입 연산자

대입 연산자의 문법은 다음과 같습니다.

variable은 tbPSM의 변수이고 expression은 tbPSM의 표현식입니다.

항목
설명

variable

tbPSM의 변수

  • 대입 연산자의 왼쪽에는 lvalue가 위치

expression

tbPSM의 표현식

  • 대입 연산자의 오른쪽에는 rvalue가 위치

  • rvalue는 실제 저장될 값

  • 변수나 상수가 올 수 있음

다음은 대입 연산자의 예입니다.

위의 예에서는 문자 상수인 ‘Seoul’과 숫자 상수인 ‘1024’가 각각 해당 변수에 대입됩니다.

연산자의 우선 순위

tbPSM의 표현식은 rvalue입니다. 표현식은 본질적으로 SQL 문장의 하위 구조이기 때문에 문장의 일부분으로 표현되어야 합니다. 예를 들어 표현식은 대입 연산자의 오른쪽 또는 SQL 문장의 일부분으로 표현될 수 있습니다. 이때 피연산자의 타입과 함께 표현식을 구성하는 연산자는 타입을 결정합니다.

피 연산자는 연산자에 대한 인수입니다. tbPSM의 연산자는 하나의 인수(unary)나 두 개의 인수(binary) 또는 그 이상의 인수를 가질 수 있습니다. 예를 들어 덧셈 연산자(+)는 단항 피연산자를 갖고, 곱셈 연산자(*)는 이항 피연산자를 갖습니다.

다음은 연산자의 우선 순위에 따라 tbPSM의 연산자를 분류한 것입니다. 아래 표에서는 가장 높은 우선 순위를 가진 연산자가 먼저 기술됩니다.

연산자
타입
설명

**

이항

지수(exponentiation)

+, -

단항

부호

*, /

이항

곱셈, 나눗셈

+, -, ||

이항

덧셈, 뺄셈, 연결(concatenation)

=, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN

이항

논리 비교

NOT

단항

논리 부정

AND

이항

논리 결합

OR

이항

논리 포함

tbPSM의 표현식에서 연산자의 우선 순위는 계산의 순서를 결정합니다.

예를 들어 위 예와 같이 곱셈이 덧셈보다 더 높은 우선 순위를 가지므로 이 식의 계산 결과는 56( = 8 * 7 )이 아니라 38( = 3 + 35 )이 됩니다.

기본적으로 부여되는 연산자의 우선 순위를 무시하기 위해서는 표현식에 괄호를 사용하면 됩니다. 예를 들어 다음 식은 56( = 8 * 7 )으로 계산됩니다.

유일한 문자 연산자는 문자열 결합을 할 수 있는 접합 연산자(||)입니다. 이 연산자는 두 개의 문자열을 하나의 문자열로 연결합니다. 예를 들어 다음 식은 'SeoulKoreaAsia'로 계산됩니다.

문자열 결합을 하는 표현식에서 모든 피연산자가 VARCHAR2 타입이라면 해당 결과 식은 VARCHAR2 타입이 됩니다. 예를 들면 다음과 같습니다. 문자열 상수는 CHAR 타입으로 간주되지만, 결과 식은 VARCHAR2 타입이 됩니다.

진리식

진리식은 진리 값(TRUE, FALSE, NULL)으로 계산되는 식입니다.

예를 들어 다음은 진리식입니다.

진리 상수나 진리 변수를 피연산자로 갖고, 진리 값을 결과로 반환하는 연산자는 AND, OR, NOT이 있습니다.

각 연산자의 결과 값은 다음과 같은 진리표를 따릅니다.

X
Y
X and Y
X or Y
not X

NULL

TRUE

NULL

TRUE

NULL

NULL

FALSE

FALSE

NULL

NULL

NULL

NULL

NULL

NULL

NULL

위 표에서 NULL은 소실된 값이거나 알지 못하는 값을 의미합니다.

다음 식은 두 번째 피연산자가 알지 못하는 값이므로 결과 값은 NULL을 반환합니다.

비교 및 관계 연산자

비교나 관계 연산자는 숫자, 문자, 데이터 피연산자를 가질 수 있으며, 진리 값을 반환합니다.

연산자는 다음과 같이 정의됩니다.

연산자
문법
정의

=

A = B

A와 B가 같음

!=

A != B

A와 B가 같지 않음

<

A < B

A가 B보다 작음

>

A > B

A가 B보다 큼

<=

A <= B

A가 B보다 작거나 A와 B가 같음

>=

A >= B

A가 B보다 크거나 A와 B가 같음

  • IS NULL 연산자 IS NULL 연산자는 피연산자가 NULL일 때만 TRUE를 반환합니다. IS NULL 이외의 연산자로는 NULL을 판단할 수 없습니다.

  • LIKE 연산자 LIKE 연산자는 문자열의 패턴을 매칭하는데 사용됩니다. 언더바(_)는 한 문자에 대응되고, 퍼센트(%)는 0개 이상의 문자에 대응합니다. 예를 들어 다음 식은 모두 TRUE를 반환합니다.

  • BETWEEN 연산자 BETWEEN 연산자는 3개의 피연산자를 갖는 연산자로서 어떤 값이 주어진 두 값 사이에 존재하는지를 판단합니다. A BETWEEN B AND C와 같이 사용되며, 이는 A가 [B, C] 사이의 값인지 아닌지를 확인합니다. 예를 들어 다음 식은 FALSE를 반환합니다.

  • IN 연산자 IN 연산자는 주어진 값이 해당 집합에 포함하는지 여부를 판단합니다. 예를 들어 다음 식은 FALSE를 반환합니다.

해당 집합이 NULL을 포함하는 경우 비교는 항상 NULL을 반환하므로 연산은 무시됩니다.

Last updated