ESQL 연결

ESQL는 내장된 SQL 이며, ESQL 사용을 위해 Tibero가 제공하는 인터페이스인 tbESQL 개념과 사용 방법을 설명합니다.

tbESQL 개념

ESQL(Embedded SQL : 내장 SQL)은 프로그래밍 언어의 연산 능력과 SQL의 데이터베이스(Database)를 조작하는 능력을 결합하기 위한 방법이며 ANSI 및 ISO 표준으로 정의되어 있습니다.

tbESQL은 ESQL의 사용을 위해 Tibero가 제공하는 인터페이스이며 C와 COBOL을 제공합니다.

tbESQL 기본동작

tbESQL에서는 프리컴파일, 컴파일 및 링크 과정을 거칩니다. 처리가 완료된 실행 파일로 실행하게 되면 Tibeo 서버에 접속하게 됩니다.

tbESQL은 내부적으로 tbCLI(=ODBC) 인터페이스를 사용합니다. 따라서 tbCLI(=ODBC) 관련 환경 변수가 모두 적용 가능합니다.

아래는 tbESQL의 기본동작을 나타내는 그림입니다.

[그림 13] tbESQL 기본동작

[그림 13] tbESQL 기본동작


tbESQL 사용

관련 파일

아래는tbESQL과 관련된 바이너리 파일에 대한 설명입니다.

프리컴파일러 및 스크립트

프리컴파일할 때 사용하는 프리컴파일러 및 컴파일할 때 참조하는 스크립트로 구성되어 있습니다.

  • 바이너리 위치

Tibero 버전

OS

위치

Tibero 7

UNIX 계열

$TB_HOME/client/bin

  • 바이너리 파일

파일명
설명

tbpc

tbESQL/C 프리컴파일러입니다.

tbpcc

tbESQL/C 컴파일 관련 스크립트(참조용)입니다.

tbpcb

tbESQL/COBOL 프리컴파일러입니다.

tbpcbc

tbESQL/COBOL 컴파일 관련 스크립트(참조용)입니다.

설정 파일

  • OS 별 설정 파일 위치

OS
위치

UNIX 계열

$TB_HOME/client/config

  • 설정파일 설명

파일명
설명

ttbpc.cfg

tbESQL/C 프리컴파일할 때 설정 파일입니다.

tbpcb.cfg

tbESQL/COBOL 프리컴파일할 때 설정 파일입니다.

tbertl.cfg

tbESQL/COBOL 런타임용 설정 파일입니다.

INCLUDE 파일

컴파일할 때 해당 파일 또는 디렉터리를 Include 합니다.

  • OS별 INCLUDE 파일 위치

OS
위치

UNIX 계열

$TB_HOME/client/include

  • INCLUDE 파일 설명

파일명
설명

sqlca.h

ESQL 관련 규약(구조체, 매크로 등)이 정의되어 있고 컴파일할 때 해당 파일의 Include가 필수입니다.

sqlda.h sqlcpr.h

Dynamic SQL을 사용하는 방법 중 방법를 사용할 때 필요한 헤더 파일입니다.

SQLCA

ESQL/COBOL에서 필요한 헤더 파일입니다.

동적 라이브러리

링크할 때 해당 파일이 존재하는 디렉터리에 대하여 설정이 필요합니다.

실행할 경우 동적 라이브러리를 찾는 경로의 환경변수 LD_LIBRARY_PATH(Linux), LIBPATH(AIX)에 해당 디렉토리가 설정되어야 합니다.

  • OS별 바이너리 위치

OS
위치

UNIX 계열

$TB_HOME/client/lib

  • 동적 라이브러리 관련 파일 (OS에 따라 파일명이 다릅니다.)

OS
파일명

UNIX 계열

  • libtbecbpp.so

  • libtbecommon.so

  • libtbecpp.so

  • libtbertl.so

  • libtbpc.so

  • libtbpcb.so

프리컴파일

프리컴파일러 바이너리를 이용하여 프리컴파일을 수행합니다.

아래는 프리컴파일할 때 동작하는 순서입니다.

  1. Preprocess 매크로 변환, 헤더 파일의 복사 등의 preprocess 과정을 수행합니다.

  2. Parsing & Check 해당 언어, ESQL, DML, 파라미터 등의 Parsing 및 Check를 수행합니다.

  3. 소스 생성 원시 소스 파일(tbc or tbco)을 읽어서 ESQL 문법에 해당하는 부분을 주석 처리한 후 해당 부분의 소스를 생성합니다.

[그림 14] 프리컴파일 소스 생성

[그림 14] 프리컴파일 소스 생성

프리컴파일 옵션

해당 부분의 내용은 Tibero 정식 매뉴얼을 참고합니다.

  • tbESQL/C 프리컴파일러 옵션

옵션
설명

CHAR_MAP

문자 배열(Character Array)을 호스트 변수로 사용할 때 남는 공간을 어떻게 채울지를 지정합니다.

CLOSE_ON_COMMIT

커밋할 때 커서를 닫을 것인가를 지정합니다.

CODE

전처리기로 전처리하여 생성되는 결과 파일의 코드를 지정합니다.

CONFIG

옵션이 기록될 환경설정 파일을 지정합니다.

CPOOL

Connection Pool 기능 사용여부를 지정합니다.

CPP_SUFFIX

생성되는 C++ 결과 파일 이름의 Suffix를 지정합니다.

DEF_SQLCODE

SQLCODE 매크로를 생성할 것인가를 지정합니다.

DEFINE

directives 전처리를 할 때 필요한 이름들을 지정합니다.

DYNAMIC

Dynamic SQL 문장의 타입을 지정합니다.

END_OF_FETCH

END-OF-FETCH 상황에 대한 SQLCODE 값을 지정합니다.

ERROR_CODE

ESQL 애플리케이션에서 많이 사용되는 3개의 에러 코드를 Tibero와 Oracle 중에 어느 것으로 사용할지 지정합니다.

HOLD_CURSOR

커서가 닫힌 후 커서 정보를 유지할 것인가를 지정합니다.

INAME

프리컴파일을 실행할 파일의 이름을 지정합니다.

INCLUDE

#include 파일의 경로를 지정합니다.

INSERT_NO_DATA_ERROR

INSERT, SELECT 시에도 NO_DATA_FOUND 기능을 사용할 것인 지를 지정합니다.

LINES

디버깅을 위한 #line 정보의 출력 여부를 지정합니다.

MODE

프로그램이 전반적으로 Tibero의 형식을 따를 것인가 아니면 ANSI의 기준을 따를 것인 가를 지정합니다.

ONAME

출력 파일의 이름을 지정합니다.

ORACA

ORACA 구조체 사용 여부를 지정합니다.

PARSE

전처리를 할 때 입력 파일의 내용을 어느 범위까지 파싱할 것인가를 지정합니다.

PREFETCH

프로그램의 속도 향상을 위해 몇 개의 로우를 미리 가져올지 지정합니다.

RELEASE_CURSOR

커서가 닫힌 후 커서 정보의 해제 여부를 지정합니다.

RUNTIME_MODE

런타임에 사용할 드라이버를 지정합니다.

SELECT_ERROR

주어진 수 보다 많은 로우가 결과로 나왔을 때 에러를 발생시킬 것인가의 여부를 지정 합니다.

SQLCHECK

SQL 문장의 내용을 어느 범위까지 검사할 것인가를 지정합니다.

SQLERRD_INIT

모든 ESQL 문장 수행 전에 SQLERRD[2] 값의 초기화 여부를 지정합니다.

STMT_CACHE

Dynamic SQL 문장에 대해 cache size를 지정합니다.

SYS_INCLUDE

전처리를 할 때 사용될 시스템 헤더 파일의 경로를 지정합니다.

THREADS

멀티 스레드를 지원할 것인가를 지정합니다.

TYPE_CODE

Dynamic SQL 문장의 방법 4를 사용하는 방법을 지정합니다.

UNSAFE_NULL

지시자 변수가 없어도 NULL 값을 허용할 것인가를 지정합니다.

USERID

SQLCHECK가 SEMANTICS으로 지정되♘을 때 서버에 접속하기 위한 사용자 정보를 지정합니다.

WORDSIZE

생성되는 결과 파일을 사용할 플랫폼의 WORDSIZE를 지정합니다.

  • tbESQL/COBOL 프리컴파일러 옵션

옵션
설명

​CLOSE_ON_COMMIT

커밋할 때 커서를 닫을 것인가를 지정합니다.

CODE

전처리기로 전처리하여 생성되는 결과 파일의 코드를 지정합니다.

COLUMNS

프로그램을 작성할 때 유효한 컬럼 범위를 지정합니다.

COMP5

프리컴파일을 실행할 때 COMP 타입에 대하여 COP-5 타입으로 변경 여부를 지정합니다.

CONFIG

옵션이 기록될 환경설정 파일을 지정합니다.

DB2_SYNTAX

DB2 array select/insert 문법 사용 여부를 지정합니다.

DECLARE_SECTION

프리컴파일을 통해 DECLARE SECTION 내에 선언된 COMP 타입의 변수를 COMP-5로 변환하여 소스를 생성합니다.

DYNAMIC

Dynamic SQL 문장의 타입을 지정합니다.

END_OF_FETCH

END-OF-FETCH 상황에 대한 SQLCODE 값을 지정합니다.

ERROR_CODE

ESQL 애플리케이션에서 많이 사용되는 3개의 에러 코드를 Tibero와 Oracle 중에 어느 것으로 사용할지 지정합니다.

HOLD_CURSOR

커서가 닫힌 후 커서 정보를 유지할 것인가를 지정합니다.

INAME

프리컴파일을 실행할 파일의 이름을 지정합니다.

INCLUDE

#include 파일의 경로를 지정합니다.

INSERT_NO_DATA_ERROR

INSERT, SELECT 시에도 NO_DATA_FOUND 기능을 사용할 것인 지를 지정합니다.

MODE

프로그램이 전반적으로 Tibero의 형식을 따를 것인가 아니면 ANSI의 기준을 따를 것 인가를 지정합니다.

ONAME

출력 파일의 이름을 지정합니다.

ORACA

ORACA 구조체 사용 여부를 지정합니다.

PARSE

전처리를 할 때 입력 파일의 내용을 어느 범위까지 파싱할 것인가를 지정합니다.

PIC9_WITH_SIGN

PIC 9 타입에 (+) 부호를 가지게 할 것인지를 지정합니다.

PICX

PIC X (CHAR Array)와 PIC N (NCHAR Array) COBOL 타입의 데이터 타입을 지정합니다.

PREFETCH

프로그램의 속도 향상을 위해 몇 개의 로우를 미리 가져올지 지정합니다.

RELEASE_CURSOR

커서가 닫힌 후 커서 정보의 해제 여부를 지정합니다.

RESERVED_WORD_COL

예약어 'COL' 사용 여부를 지정합니다.

RESERVED_WORD_CURSOR

예약어 'CURSOR' 사용 여부를 지정합니다.

RUNTIME_MODE

런타임에 사용할 드라이버를 지정합니다.

SELECT_ERROR

주어진 수 보다 많은 로우가 결과로 나왔을 때 에러를 발생시킬 것인가의 여부를 지정합니다.

SQLCHECK

SQL 문장의 내용을 어느 범위까지 검사할 것인가를 지정합니다.

STMT_CACHE

Dynamic SQL 문장에 대해 cache size를 지정합니다.

SYS_INCLUDE

전처리를 할 때 사용될 시스템 헤더 파일의 경로를 지정합니다.

THREADS

멀티 스레드를 지원할 것인가를 지정합니다.

TYPE_CODE

Dynamic SQL 문장의 방법 4를 사용하는 방법을 지정합니다.

UNSAFE_NULL

지시자 변수가 없어도 NULL 값을 허용할 것인가를 지정합니다.

USERID

SQLCHECK가 SEMANTICS으로 지정되었을 때 서버에 접속하기 위한 사용자 정보를 지정합니다.

VARCHAR

사용자의 암시적인 varchar structure 사용을 허용합니다.

WORDSIZE

생성되는 결과 파일을 사용할 플랫폼의 WORDSIZE를 지정합니다.

사용 예제

ESQL/C로 예를 들면 아래와 같습니다.

tbpc -h
tbpc test1
tbpc iname=test1.tbc
tbpc test1 lines=yes
$ tbpc -h
Usage: tbpc [-h] [-v] [options] file...

  -h   show this help.
  -v   show tbESQL version.

Option Name          Default   Description   
---------------------------------------------------------------
CHAR_MAP             CHARZ    Mapping of character arrays and strings          
CLOSE_ON_COMMIT      NO       Close all cursors on COMMIT                      
CODE                 C        The user language type                            
CONFIG               default  The name of user configuration file              
CPOOL                NO       Use connection pool                              
CMAX                 100      Configure maximum value for connection of cpool  
CMIN                 1        Configure mininum value for connection of cpool  
CINCR                1        Configure increment unit for connection of cpool  
CTIMEOUT             0        Configure time for timeout of cpool              
CNOWAIT              NO       Using nowait feature                              
CPP_SUFFIX           N/A      C++ filename suffix of generated code            
DEF_SQLCODE          NO       Whether precompiler generates SQLCODE macro      
DEFINE               N/A      Define name for c preprocessor         
DYNAMIC              TIBERO   Tibero or ANSI, Oracle Dyn-SQL Semantics          
END_OF_FETCH         1403     End of FETCH SQLCODE value { 1403 | 100 }        
ERROR_CODE           DEFAULT  The error code to DEFAULT or TIBERO              
HOLD_CURSOR          NO       Control holding of cursors after closing          
IGNORE_ERROR         NO       Ignore the semantic check error.                  
INAME                N/A      The name of the input file                        
INCLUDE              N/A      Directory paths for included files                
INSERT_NO_DATA_ERROR NO       it returns 1403 as error code when data is not fou 
LINES                NO       Whether to print #line directives for debugging  
MODE                 TIBERO   Code conformance to Tibero or ANSI, Oracle        
ONAME                N/A      The name of the output file                      
ORACA                NO       Whether to use the oraca sturucture              
PARSE                FULL     Specifies which non-SQL code is parsed            
PREFETCH             1        Number of rows pre-fetched at cursor OPEN time    
RELEASE_CURSOR       NO       Control release of cursors after closing          
RUNTIME_MODE         TIBERO   TIBERO, ODBC or ORACLE to use for esql runtime    
SELECT_ERROR         YES      Control flagging of select errors                
SQLCHECK             SYNTAX   Amount of compile-time SQL checking              
SQLERRD_INIT         YES      Whether to initialize SQLCA.SQLERRD[2] always    
STMT_CACHE           0        Size of the statement cache                      
SYS_INCLUDE          N/A      Directory paths for system header files          
THREADS              NO       Indicates multi-threads application              
TYPE_CODE            TIBERO   Tibero or ANSI, Oracle type codes for Dyn-SQL    
UNSAFE_NULL          NO       prevent 1405 error when indicator is not specified 
USERID               N/A      Specifies Tibero username and password            
VARCHAR_SIZE         NO       Aligns the data for varchar structures            
WORDSIZE             64       Wordsize of platform generated source will be used

컴파일 및 링크

프리컴파일 과정을 거친 후 해당 프로그래밍 언어의 컴파일러를 이용하여 컴파일 및 링크를 수행합니다.

각 OS별로 ESQL/C의 예를 들면 아래와 같습니다. (프리컴파일이 완료된 파일이 test.c일 경우)

Linux

cc -m64 -O -I$TB_HOME/client/include -L$TB_HOME/client/lib -c test.c
cc -m64 -O -I$TB_HOME/client/include -o test.bin -L$TB_HOME/client/lib -ltbxa -ltbertl -
ltbcli -lclialloc test.o

AIX

gcc -maix64 -Wl,-brtl -o $1 $1.c -g -I$TB_HOME/client/include -L$TB_HOME/client/lib - 
ltbertl -ltbcli -lpthread -lm
cc -q64 -brtl -o $1 $1.c -g -I$TB_HOME/client/include -L$TB_HOME/client/lib -ltbertl - 
ltbcli -lpthread -lm


문제 해결

특정 문제가 발생했을 때 해결하는 방법을 설명합니다.

로그 발생

tbESQL은 내부적으로 tbCLI(=ODBC) 인터페이스를 사용합니다. 따라서 tbCLI(=ODBC) 관련 환경변수를 적용하면 로그를 발생시킬 수 있습니다.

단계별 대처 방안

아래는 문제 발생에 대한 단계별 대처 방법입니다.

  • 프리컴파일할 때 문제 발생 소스 라인의 문제인지 프리컴파일러의 옵션이 미적용되어 발생한 문제인지 확인합니다.

  • 컴파일 및 링크할 시 문제 발생 일반 소스상의 문제라면 해당 프로그램 언어의 문법이 맞는지 확인하고 프리컴파일을 통해 Tibero에서 생성한 소스 부분이 문제라면 기술 지원이 필요합니다.

  • 실행 시 문제 발생 tbCLI(=ODBC) 환경변수를 적용하여 로그를 출력합니다.

에러 코드

아래는 자주 사용되는 에러 코드에 대한 설명입니다.

에러코드
설명

1403

NO_DATA_FOUND

-1405

NULL INDICATOR

-1

DUP_VAL_ON_INDEX

-5070

ZERO_DIVIDE

-5074

INVALID_NUMBER

-11025

Data is too long for the column

-17001

Login failed: invalid user name or password

-9071

Not logged into the server

-8026

Specified column name was not found

-8033

Object not found

-2011

Binding Count Error

-2025

Fetch out of sequence

-12003

Session Full


예제

본 절에서는 makefile을 이용한 예제를 설명합니다.

makefile 예제

아래 예제는 Linux에서 사용하는 예제로 각 사이트 상황에 맞추어 수정해서 사용합니다.

아래 내용 복사 시, 탭 부분의 복사가 잘되지 않으면 직접 탭을 적용합니다.

# Server ESQL*C makefile

TBLIBDIR = $(TB_HOME)/client/include

LFLAGS = -ltbertl -ltbcli
CFLAGS = -I$(TB_HOME)/client/include -L$(TB_HOME)/client/lib 
ADDFLAGS = -m64 -O

# command
CC = /usr/bin/cc
TBPC = $(TB_HOME)/client/bin/tbpc
########### modify start##############

# ESQL Include Path
INCLUDE1 = /usr/include
INCLUDE2 = $(TB_HOME)/client/include
INCLUDE3 = /usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

# File Name 
SRC_NAME=test

########### modify end##############

TARGET = $(SRC_NAME).bin
OBJECT = $(SRC_NAME).o 
TBPCFILE = $(SRC_NAME).tbc

all : $(TARGET)

# Build
$(TARGET): $(OBJECT)
    $(CC) $(ADDFLAGS) $(CFLAGS) $(LFLAGS) $(OBJECT) -o $(TARGET) 
    
# C Compile
$(OBJECT): $(SRC_NAME).c
    $(CC) $(ADDFLAGS) $(CFLAGS) -c $(SRC_NAME).c 
    
# Tibero ESQL PreCompile
$(SRC_NAME).c : $(TBPCFILE)
    $(TBPC) iname=$(TBPCFILE) \
        oname=$(SRC_NAME).c \
        include=$(INCLUDE1) \
        include=$(INCLUDE2) \
        include=$(INCLUDE3)
        
# cleaning object
clean :
    rm -f $(SRC_NAME).o $(SRC_NAME).c $(SRC_NAME).bin

Last updated