데이터 타입

tbESQL/COBOL 프로그램에서 사용하는 데이터 타입을 알아보고, 데이터 타입 간의 대응을 설명합니다.

세부 설명입니다.

데이터 타입
설명

CHAR

일반 문자열을 저장하는 데이터 타입(예: CHAR(10))

VARCHAR

일반 문자열을 저장하는 데이터 타입 (예: VARCHAR(10))

RAW

임의의 바이너리 데이터를 저장하는 데이터 타입 (예: RAW(10))

NUMBER

정수 또는 실수를 저장하는 타입 NUMBER 타입을 선언할 때 정밀도와 스케일 을 함께 선언할 수 있음

  • 정밀도 : 데이터 값의 전체 자릿수

  • 스케일 : 소수점 이하 자릿수

INTEGER FLOAT

  • 기본적으로는 NUMBER 타입

  • 단, NUMBER 타입과는 다르게 정밀도와 스케일을 선언할 때 범위에 한계를 둠

  • NUMBER 타입의 값은 Tibero에서 가변 길이로 저장되며, 실제 값과 정밀도, 스케일에 따라 그 길이가 달라짐

DATE

TIME

TIMESTAMP

특정 날짜와 시간을 나타내는 데이터 타입

  • DATE : 특정 날짜

  • TIME : 특정 시간

  • TIMESTAMP : 특정 날짜와 시간

BLOB

  • 임의의 바이너리 데이터를 데이터베이스에 저장하는 데이터 타입

  • 한 테이블의 여러 컬럼에 선언할 수 있음

CLOB

  • 읽을 수 있는 문자열을 데이터베이스에 저장하는 데이터 타입

  • 한 테이블의 여러 컬럼에 선언할 수 있음

ROWID

  • 시스템이 각 로우마다 자동으로 부여하는 데이터 타입

  • 각 로우가 저장된 물리적인 위치를 포함

tbESQL/COBOL 데이터 타입

본 절에서는 tbESQL/COBOL의 데이터 타입을 설명합니다.

데이터 타입 대응

Tibero에서 제공하는 데이터 타입을 tbESQL/COBOL 프로그램에서 그대로 사용할 수는 없습니다.

tbESQL/COBOL에는 Tibero의 각 데이터 타입에 대응되는 tbESQL/COBOL의 데이터 타입이 정의되어 있 다. tbESQL/COBOL의 데이터 타입은 대체로 COBOL 프로그래밍 언어의 데이터 타입과 동일합다. 또한 각 Tibero의 데이터 타입에 대응되는 tbESQL/COBOL의 데이터 타입은 하나 이상일 수도 있습니다.

다음은 Tibero의 데이터 타입에 대응되는 tbESQL/COBOL의 데이터 타입입니다.

Tibero의 데이터 타입
tbESQL/COBOL의 데이터 타입
설명

CHAR, VARCHAR

PIC X(n), PIC X(n) VARYING

길이 n의 문자열

RAW

PIC X(n) VARYING

길이 n의 바이너리 데이터

NUMBER

PIC S9(n)

정수 데이터

NUMBER

PIC S9(n)V9(n)

실수 데이터(데이터가 삽입될 때 이미 정해진 컬럼의 정밀도 및 스케일을 초과할 수 있다.)

DATE, TIME, TIMESTAMP

PIC X(n), PIC X(n) VARYING

길이 n의 문자열로 변환

ROWID

PIC X(n), PIC X(n) VARYING

길이 n의 문자열로 변환

tbESQL/COBOL의 데이터 타입 중 VARYING 키워드를 사용해서 선언하는 VARCHAR 타입은 Tibero의 데이터 타입 중에 VARCHAR 타입을 비롯한 여러 가지 타입에 대응하기 위해 새롭게 정의된 타입입니다.

tbESQL/COBOL 프로그램에서는 각 데이터 타입 간의 변환을 지원합니다. 예를 들어 VARCHAR 타입의 문 자열이 정수를 표현하고 있는 내용이라면, 그 값을 PIC S9(n) 타입의 변수에 저장할 수 있습니다. 또한 실제로 DATE, TIME, TIMESTAMP 타입과 ROWID 타입에 바로 대응되는 타입은 없으며, 항상 변환 과정을 거쳐 서 저장해야 합니다.

circle-info

참고

VARCHAR 타입의 자세한 내용은 “VARCHAR”를 참고합니다.

데이터 타입 변환

tbESQL/COBOL 프로그램에서는 Tibero 데이터 타입 각각에 대응되는 타입 이외에 다른 데이터 타입을 사용할 수 있습니다. 예를 들면 데이터베이스의 NUMBER 타입의 컬럼 값을 저장하기 위해 tbESQL/COBOL 프로그램에서는 출력 변수로 VARCHAR 타입을 사용할 수 있습니다. 이와 반대로 NUMBER 타입 프로그램 변 수의 값을 VARCHAR 타입의 컬럼에 저장할 수도 있습니다.

tbESQL/COBOL 프로그램을 프리컴파일하면 입/출력 변수의 데이터 타입이 프로그램 내에 함께 포함된 다. 이렇게 포함된 데이터 타입을 기준으로 데이터의 값이 입/출력될 때 컬럼 타입과 비교하여 필요한 경 우에는 데이터 타입의 변환을 수행합니다. 만약 데이터 타입의 변환이 불가능한 경우에는 에러를 반환합니다.

변환 가능한 데이터 타입

다음은 Tibero 데이터 타입으로부터 변환 가능한 tbESQL/COBOL 데이터 타입입니다. “데이터 타입 대응”의 일부 내용이 포함되어 있습니다.

Tibero의 데이터 타입
tbESQL/COBOL의 데이터 타입
설명

NUMBER

PIC S9(n)

정수 데이터

NUMBER

PIC S9(n)V9(n)

실수 데이터

CHAR, VARCHAR

PIC X(n), PIC X(n) VARYING

문자열 데이터(실수를 포함한다.)

DATE, TIME, TIMESTAMP

PIC X(n), PIC X(n) VARYING

날짜형 데이터

ROWID

PIC X(n), PIC X(n) VARYING

ROWID 데이터

tbESQL/COBOL 데이터 타입으로부터 Tibero 데이터 타입으로 변환할 때에도 위의 변환 관계가 적용된 다. 예를 들어 tbESQL/COBOL 프로그램의 PIC S9(n) 타입의 변수 값을 VARCHAR 타입 컬럼에 저장할 수 있으며, VARYING 키워드를 통해 선언하는VARCHAR 타입 값을 이용하여 ROWID에 대한 질의를 수 행할 수 있습니다.

다음은 데이터 타입의 변환을 수행하는 예입니다.

[예 1] 데이터 타입의 변환

위의 [예 1]을 실행하면 다음과 같은 내용이 출력됩니다.

데이터 타입을 변환할 때에는 데이터 값의 범위와 내용에 유의해야 합니다. 데이터 값의 범위는 그 값을 저 장할 장소가 충분히 포함할 수 있는 한도 내이어야 합니다.

예를 들면 tbESQL/COBOL 프로그램의 PIC S9(3) 타입의 변수에 그 범위를 넘어서는 값인 문자열 "327680"을 변환하거나, 마찬가지로 VARCHAR(3)의 타입을 갖는 컬럼에 그 범위를 넘어서는 값인 65535 를 변환할 수 없습니다. 데이터의 내용은 데이터베이스 컬럼에 저장된 "ABCDE" 문자열을 프로그램 PIC S9(3) 타입의 변수에 변환할 수 없으며, 프로그램 변수에 저장된 "가나다" 문자열을 DATE 타입의 컬럼에 변환 할 수 없습니다.

내장 함수를 이용한 데이터 타입 변환

Tibero 내장 함수를 이용하여 데이터 타입의 변환을 실행할 수도 있습니다. 그러한 함수로는 TO_CHAR, TO_DATE, TO_NUMBER 등이 있습니다.

다음은 TO_CHAR 함수를 이용하여 실수 데이터를 문자 데이터로 변환하여 출력하는 예입니다.

[예 2] TO_CHAR 함수를 이용한 데이터 타입 변환

① 실수 데이터를 담고 있는 변수 SALARY를 TO_CHAR 함수를 통해 형식 문자열('$99,999.99')을 지정하 여 문자 데이터로 변환합니다.

② VARCHAR 타입 변수 SAL-STR에 저장합니다.

③ DISPLAY 문을 통해 SAL-STR 변수를 출력합니다.

위의 [예 2]을 실행하면 다음과 같은 내용이 출력됩니다.

circle-info

참고

데이터 타입을 변환하는 내장 함수에 대한 자세한 내용은 "Tibero SQL 참조 안내서"를 참고합니다.

데이터 변수 사용

COBOL 프로그래밍 언어의 변수와는 달리 tbESQL/COBOL 프로그램에서 데이터베이스 작업과 관련된 변수는 모두 DECLARE 영역 내에 선언되어야 합니다.

다음은 DECLARE 영역 내에 선언된 변수의 예입니다.

위의 예에서 알 수 있듯이 DECLARE 영역은 **'EXEC SQL BEGIN DECLARE SECTION END-EXEC.'**로 시작하고 **'EXEC SQL END DECLARE SECTION END-EXEC.'**로 끝난다.

VARCHAR 타입은 일반적인 CHAR 배열 타입과 유사하게 선언합니다. CHAR 타입과는 달리 배열이 아닌 형태로는 선언이 불가능합다. 프리컴파일 과정을 거치면 VARCHAR 타입은 tbESQL/COBOL에서 정의한 구조체 타입으로 변환됩니다.

DECLARE 영역 내에 선언된 변수는 COBOL 프로그래밍 언어의 변수와 동일한 방법으로 프로그램 내에 서 사용됩니다. 하지만 tbESQL/COBOL 문장 내에서의 변수는 tbESQL/COBOL 문장과의 구별을 위하여 반 드시 콜론(:) 뒤에 와야 합니다. 이렇게 콜론(:) 뒤에 사용된 tbESQL/COBOL 문장 내의 변수를 입**/**출력 변수 라고 부릅니다.

다음은 tbESQL/COBOL 문장 내에서 사용된 입력 변수와 출력 변수에 대한 예입니다.

위의 예에서는 SELECT 문장을 실행하기 위해 먼저 입력 변수 EMPNO의 값을 읽어와 tbESQL/COBOL 문장을 완성합니다. 그리고 나서 SELECT 문장을 실행하고 실행 결과로 반환된 로우의 각 컬럼 값이 출력 변수 ENAME, SALARY, ADDR에 할당됩니다. 출력 변수 ENAME, SALARY, ADDR은 COBOL 프로그래밍

언어의 변수와 마찬가지로 사용될 수 있습니다.

만약 SELECT 문장의 실행 결과로 반환된 로우가 없거나 둘 이상의 로우가 반환되면 에러가 발생합니다. 이 러한 경우 에러를 처리하는 루틴이 미리 정의되어 있으면 그 루틴을 실행하게 되고, 그렇지 않으면 프로그 램을 종료합니다.

ROWID

ROWID 타입은 로우의 물리적인 위치 정보를 포함하는 데이터 타입입니다. tbESQL/COBOL에서는 ROWID 를 위한 별도의 데이터 타입을 제공하지 않습니다. PIC X(n) 타입 또는 VARCHAR(VARYING) 타입을 이용 해 데이터 타입을 변환하여 사용해야 합니다.

ROWID 타입의 값은 다음의 그림에서처럼 4부분으로 구성됩니다.

[그림 1] ROWID 구성

img

문자열 변수에 저장되는 ROWID 값은 전체 18bytes를 가지므로, 문자열 변수의 길이는 NULL 값을 포함 하여 최소한 19bytes가 되어야 합니다. Tibero 의 데이터베이스에서는 다른 형태로 저장됩니다.

circle-info

참고

ROWID 타입에 대한 자세한 내용은 "Tibero SQL 참조 안내서"를 참고합니다.

다음은 ROWID 타입을 사용하는 예입니다.

[예 3] ROWID 타입의 사용

ROWID의 값은 이처럼 출력 변수로 사용될 뿐만 아니라 SELECT 문장의 WHERE 절이나 INSERT 문장 에서 입력 변수로 사용될 수도 있습니다.

위의 [예 3]을 실행하면 다음과 같은 내용이 출력됩니다.

VARCHAR

VARCHAR 타입은 Tibero의 데이터 타입의 VARCHAR 타입을 tbESQL/COBOL 프로그램에서 사용하기 위해 새롭게 정의한 데이터 타입입니다. VARCHAR 타입은 RAW, DATE, ROWID 타입에도 대응하여 사용 할 수 있습니다.

VARCHAR 타입 변수 선언

VARCHAR 타입 변수 선언은 COBOL 프로그래밍 언어에서 PIC X(n) 타입의 배열 변수를 선언하는 것과 동일한데, 마지막에 VARYING 키워드를 삽입합니다. PIC X(n)과 마찬가지로 문자열의 최대 크기를 반드시 지정해 주어야 합니다.

다음은 VARCHAR 타입 변수를 선언하는 예입니다.

[예 4] VARCHAR 타입 변수 선언

위의 [예 4]에서 선언된 VARCHAR 타입 변수는 프리컴파일러를 통하여 다음과 같은 구조체 타입의 변 수로 변환됩니다.

[예 5] VARCHAR 타입이 변환된 구조체

VARCHAR 타입 변수의 참조와 일관성

VARCHAR 타입 변수를 선언할 때를 제외하고, VARCHAR 타입 변수를 사용하기 위해서는 프리컴파일러 가 변환한 구조체의 문법을 따라야 합니다.

예를 들어 위의 [예 4]에서 선언한 USERNAME을 출력하고자 합니다면, 프리컴파일러에 의해 변환된 [예 5]의 구조체를 출력하는 문법에 맞춰 다음과 같이 코드를 작성합니다.

VARCHAR 구조체 내의 변수 LEN과 ARR은 입력 변수일 때 또는 출력 변수일 때 상관없이 항상 일관성을 유지해야 합니다. 즉, 다음과 같은 조건을 만족해야 합니다.

[예 6] VARCHAR 변수의 일관성

VARCHAR 타입 변수가 입력 변수로 사용되었는지, 출력 변수로 사용되었는지에 따라서 위의 조건을 만 족시키기 위한 방법은 다릅니다.

VARCHAR 타입 변수
설명

입력 변수

  • 입력 변수로 사용된 경우 tbESQL/COBOL 프로그램 내에 조건을 유지시키는 코드를 작성해야 함

  • 조건을 만족하지 않는다면 tbESQL/COBOL 라이브러 리에서는 LEN 변수를 우선적으로 참조

출력 변수

출력 변수로 사용된 경우 tbESQL/COBOL 라이브러리 내에서 자동으로 조건 을 유지시킴

NULL 값의 처리

VARCHAR 타입 변수의 값이 NULL인 경우에는 프리컴파일러를 통해 변환된 구조체 내의 변수 ARR과 LEN의 값은 다음과 같습니다.

VARCHAR 타입 변수의 값이 NULL일 때 VARCHAR 타입 변수가 입력 변수로 사용되었는지, 출력 변수 로 사용되었는지에 따라 변환된 구조체 내의 멤버 변수 ARR과 LEN의 값은 다릅니다.

VARCHAR 타입 변수
설명

입력 변수

  • 입력 변수인 경우에는 LEN 변수에 0을 할당하는 코드를 작성해야 함

  • 만약 ARR 문자열의 길이가 0이 아니더라도 LEN 변수를 먼저 참조하므로 NULL로 인식

출력 변수

출력 변수인 경우에는 ARR과 LEN의 값을 tbESQL/COBOL 라이브러리에서 자동으로 설정

다음은 VARCHAR 타입의 출력 변수 ADDR의 값으로 NULL이 반환되었는지 검토하여 출력하는 예입니다.

구조체

tbESQL/COBOL 프로그램에서도 COBOL 프로그래밍 언어의 구조체를 사용할 수 있습니다.

tbESQL/COBOL 프로그램의 SELECT 문장에서는 질의 결과로 반환되는 컬럼의 개수만큼 INTO 절에 출 력 변수를 명시해야 합니다. 이런 경우에 INTO 절에 명시될 다수의 출력 변수를 한데 묶어 구조체를 만들고, INTO 절에 이 구조체 변수 하나만 명시해 프로그램을 간소화할 수 있습니다.

구조체 변수를 사용할 때에 유의할 점은 SELECT 문장의 결과 로우 내의 컬럼의 순서와 구조체 변수 내의 변수의 순서가 같아야 합니다는 점입니다.

다음은 3개의 출력 변수를 포함하는 구조체를 사용한 예입니다.

구조체 변수는 INSERT 문장 등에서 입력 변수로 사용될 수도 있습니다. 이때에도 출력 변수와 동일하게 하나 의 구조체 변수만 사용할 수 있으며, 구조체 내부에 삽입하려는 컬럼과 같은 순서로 변수가 정의되어 있어 야 합니다.

다음은 3개의 컬럼에 값을 삽입하는 예입니다.

지시자

일반 프로그램과 달리 tbESQL/COBOL 프로그램에서만 사용되는 변수로 지시자(INDICATOR) 변수가 있 다. tbESQL/COBOL 문장을 통해 데이터베이스와 tbESQL/COBOL 프로그램 간에 데이터를 주고 받을 때 지시자 변수는 전달된 데이터에 대한 정보를 저장하고 있습니다.

지시자 변수의 선언

지시자 변수는 PIC S9(4) COMP-5 타입을 가지며, 반드시 DECLARE 영역 안에 선언되어야 합니다.

SELECT 문장에 사용된 지시자 변수는 INTO 절에서 INDICATOR 키워드와 콜론(:) 다음에 오거나, INDI CATOR 없이 데이터 변수 바로 뒤에 콜론(:)과 함께 올 수도 있습니다.

다음은 SELECT 문장에서 출력 변수와 지시자 변수가 사용된 예입니다.

[예 7] 출력 변수와 지시자 변수

위의 예에서는 출력 변수 ENAME에 대응되는 지시자 변수로 IND_ENAME이 사용되었고, 출력 변수 ADDR

에 대응되는 지시자 변수로는 IND-ADDR가 사용되었습니다.

INDICATOR 키워드를 명시하지 않고 다음과 같이 작성해도 위의 [예 7] 문장과 동일한 의미를 갖습니다.

다음은 출력 변수와 함께 사용된 지시자 변수 값의 의미를 정리한 표입니다. tbESQL/COBOL 프로그램에서 는 필요한 경우 지시자 변수의 값을 검토하여 그 값에 따른 처리를 해야 합니다.

지시자 변수의 값
설명

0

데이터 값이 성공적으로 저장됨

-1

데이터 값이 NULL

> 0

  • 문자열 데이터 변수에 저장된 값이 잘린(truncated) 값

  • 지시자 변수에 주어진 값은 실제 데이터베이스에 저장된 문자열의 길이

다음은 INSERT 문장에서 입력 변수와 함께 지시자 변수를 사용한 예입니다.

[예 8] 입력 변수와 지시자 변수

위의 예에서는 입력 변수로 ENAME, ADDR, EMPNO가 사용되었으며, 입력 변수 ADDR에 대응되는 지시 자 변수로 IND-ADDR이 사용되었습니다.

INDICATOR 키워드를 명시하지 않고 다음과 같이 작성해도 위의 [예 8] 문장과 동일한 의미를 갖습니다.

위의 예에서는 INDICATOR 키워드를 생략하고 입력 변수 ADDR 뒤에 지시자 변수 IND-ADDR을 바로 붙 여서 명시하였습니다.

지시자 변수 값이 -1인 경우에는 입력 변수의 값이 NULL이라는 의미입니다. 이때 입력 변수에 저장된 실제 값은 무시됩니다. 따라서 지시자 변수의 값이 -1인 경우 앞의 INSERT 문장은 다음과 같이 고쳐 써도 됩니다.

지시자 변수 값이 -1인 경우는 입력 변수 ADDR의 값이 NULL이라는 것이므로 입력 변수와 지시자 변수를 명시할 필요 없이 NULL만 명시해도 됩니다.

다음은 입력 변수와 함께 사용된 지시자 변수 값의 의미를 정리한 표입니다.

지시자 변수의 값
설명

-1

데이터 값이 NULL

>= 0

입력 변수에 저장된 값을 그대로 사용

지시자 변수를 사용하지 않고 tbESQL/COBOL 프로그램을 작성할 수도 있지만, SQL 문장의 질의 결과로 반환되는 값에 대해 충분히 알고 있지 않다면 지시자 변수를 사용하여 검토하는 코드를 삽입하는 것이 좋습니다.

구조체 타입의 지시자

SELECT 문의 INTO 절에 구조체 변수와 지시자 변수를 함께 사용하는 경우 지시자 변수 역시 마찬가지로 별도의 구조체 변수로 구성해야 합니다. 이러한 지시자 변수를 구조체 타입의 지시자(STRUCTURAL INDI CATOR)라고 부릅니다.

구조체 타입의 지시자도 출력 구조체 변수를 구성하는 것과 마찬가지로 질의 결과 컬럼과 같은 순서로 지 시자 변수가 와야 합니다. 또한 모든 지시자 변수는 PIC S9(4) COMP-5 타입을 갖습니다.

다음은 구조체 타입의 지시자 변수를 사용하는 예입니다.

① 컬럼 ENAME, SALARY, ADDR의 내용을 저장하기 위해서 구조체 타입의 변수로 EMP를 선언합니다.

② 이 구조체 변수를 SELECT 문장의 출력 변수로 사용하면서, 이에 대응되는 지시자 변수 EMP_IND 역 시 구조체 변수로 선언합니다. 구조체 변수 EMP_IND를 정의할 때 구조체 내의 멤버 변수를 EMP에 대응되 게 정의하고, EMP_IND의 모든 멤버 변수를 PIC S9(4) COMP-5 타입으로 정의합니다.

Last updated