DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

프로그래밍

DBMS 2
DB2 가이드
DB2 사용자 가이드
프로그래밍
작성자
admin
작성일
2021-02-19 14:54
조회
981

프로그래밍

ESQL

ESQL은 데이터의 액세스는 SQL문으로 구현하고, 프로그램의 로직은 프로그래밍 언어로 구현 하는 혼합 방식입니다. 프리컴파일과 SQL문에 대한 바인드, 프로그래밍 언어에 대한 컴파일과 링크 과정을 통해서 팩키지와 바이너리 실행 파일을 생성합니다.

db2

DB2 개발자로 로그인하여 ESQL/C 소스 파일을 작성합니다. 확장자를 sqc 로 지정합니다.


#include stdio.h>
EXEC SQL INCLUDE SQLCA;
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
char fname[13];
char lname[16];
char newfname[13];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO sample;
printf("Enter the lastname : ");
gets(lname);
EXEC SQL SELECT FIRSTNME INTO :fname
FROM employee
WHERE LASTNAME = :lname;
if (SQLCODE == 0)
printf("First name = %s\n", fname);
else if (SQLCODE == 100)
printf("Data is not found\n");
else {
printf("Select Error : SQLCODE = %ld\n", SQLCODE);
EXEC SQL ROLLBACK;
EXEC SQL CONNECT RESET;
return (-1);
}
EXEC SQL COMMIT;
EXEC SQL CONNECT RESET;
return(0) ;
}

prep 명령어로 프리컴파일하고, bind 명령어로 팩키지를 생성합니다.


$ db2 connect to 데이터베이스명>
$ db2 prep 소스파일명>.sqc bindfile
$ db2 bind 소스파일명>.bnd blocking all grant public

C 컴파일러를 이용하여 컴파일과 링크를 실행하십시오.


$ xlc -c 소스파일명>.c ?I~인스턴스명>/sqllib/include
$ xlc -o 실행파일명> 소스파일명>.o -ldb2 ?L~인스턴스명>/sqllib/lib

바이너리 형식의 실행 모듈을 실행하십시오.


$ 실행파일명>
Enter the lastname : LEE
First name = Newman

CLI

CLI는 데이터를 액세스하는 SQL문은 C 라이브러리 형식으로 된 API 로 구현하고, 프로그램 의 로직은 C 언어로 구현하는 방식입니다. C 언어에 대한 컴파일과 링크 과정을 통해서 바이너 리 실행 파일을 생성합니다. ESQL 에서 지원하는 동적 SQL문에 대응하는 API 가 모두 지원됩 니다.

db2

DB2 개발자로 로그인하여 CLI 소스 파일을 작성합니다. 확장자를 c 로 지정합니다.


#include stdio.h>
#include sqlcli1.h>
main() {
SQLHANDLE henv;
SQLHANDLE hdbc;
SQLHANDLE hstmt;
SQLCHAR * stmt = ( SQLCHAR * ) "SELECT deptnumb, location
FROM org";
SQLRETURN sqlrc = SQL_SUCCESS;
struct
{ SQLINTEGER ind ;
SQLSMALLINT val ;
} deptnumb ;
struct
{ SQLINTEGER ind ;
SQLCHAR val[15] ;
} location ;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
SQLConnect(hdbc, (SQLCHAR *)"SAMPLE", SQL_NTS, NULL,
SQL_NTS, NULL, SQL_NTS);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLExecDirect( hstmt, stmt, SQL_NTS ) ;
printf("DEPTNUMB LOCATION \n" ) ;
printf("-------- ------------\n" ) ;
sqlrc = SQLFetch( hstmt );
if (sqlrc == SQL_NO_DATA_FOUND)
printf("\n Data not found.\n");
while (sqlrc != SQL_NO_DATA_FOUND)
{
sqlrc = SQLGetData( hstmt, 1, SQL_C_SHORT, &deptnumb.val,
0, &deptnumb.ind ) ;
sqlrc = SQLGetData( hstmt, 2, SQL_C_CHAR, location.val,
15, &location.ind ) ;
printf( "%-8d %-14.14s \n", deptnumb.val, location.val ) ;
sqlrc = SQLFetch( hstmt );
}
SQLFreeStmt(hstmt, SQL_CLOSE);
SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}

C 컴파일러를 이용하여 컴파일과 링크를 실행하십시오.


$ xlc -c 소스파일명>.c ?I~인스턴스명>/sqllib/include
$ xlc -o 실행파일명> 소스파일명>.o -ldb2 ?L~인스턴스명>/sqllib/lib

바이너리 형식의 실행 모듈을 실행하십시오.


$ 실행파일명>
DEPTNUMB LOCATION
---------------------------------
10 New York
15 Boston
20 Washington
38 Atlanta
42 Chicago
51 Dallas
66 San Francisco
84 Denver
10 New York
15 Boston
20 Washington
38 Atlanta
42 Chicago
51 Dallas
66 San Francisco
84 Denver

API

API는 DB2 명령어를 C 라이브러리 형식으로 된 API 로 구현하는 방식입니다. 데이터 액세스 에 SQL문을 사용하고, 프로그램 로직을 C 언어로 구현하는 것은 ESQL/C 와 동일합니다

db2

DB2 개발자로 로그인하여 API 를 포함한 ESQL/C 소스 파일을 작성합니다. ESQL/C 소스 이므로 확장자는 sqc 로 지정합니다.


$ login DB2 개발자>
$ vi 소스파일명>.sqc
#include stdio.h>
#include stdlib.h>
#include sqlutil.h>
int main()
{
struct sqlca sqlca;
char dataFileName[256];
struct sqldcol dataDescriptor;
char actionString[256];
struct sqlchar *pAction;
char msgFileName[128];
struct sqluexpt_out outputInfo;
EXEC SQL connect to sample;
strcpy(dataFileName, "ORG.DEL");
dataDescriptor.dcolmeth = SQL_METH_D;
strcpy(actionString, "SELECT deptnumb, deptname FROM org");
pAction = (struct sqlchar *)malloc(sizeof(short) + sizeof(actionString)
+ 1);
pAction->length = strlen(actionString);
strcpy(pAction->data, actionString);
strcpy(msgFileName, "tbexport.MSG");
outputInfo.sizeOfStruct = SQLUEXPT_OUT_SIZE;
printf(" client destination file name: %s\n", dataFileName);
printf(" action : %s\n", actionString);
printf(" client message file name : %s\n", msgFileName);
sqluexpr(dataFileName,
NULL,
NULL,
&dataDescriptor,
pAction,
SQL_DEL,
NULL,
msgFileName,
SQLU_INITIAL,
&outputInfo,
NULL,
&sqlca);
free(pAction);
EXEC SQL connect reset;
return 0;
}

C 컴파일러를 이용하여 컴파일과 링크를 실행하십시오.


$ xlc -c 소스파일명>.c ?I~인스턴스명>/sqllib/include
$ xlc -o 실행파일명> 소스파일명>.o -ldb2 ?L~인스턴스명>/sqllib/lib

바이너리 형식의 실행 모듈을 실행하십시오.


$ 실행파일명>
$ cat ORG.DEL
10,"Head Office"
15,"New England"
20,"Mid Atlantic"
38,"South Atlantic"
42,"Great Lakes"
51,"Plains"
66,"Pacific"
84,"Mountain"
10,"Head Office"
15,"New England"
20,"Mid Atlantic"
38,"South Atlantic"
42,"Great Lakes"
51,"Plains"
66,"Pacific"
84,"Mountain"

JDBC

SQLJ 또는 JDBC 방식으로 작성합니다. 데이터 액세스는 JDBC에서 제공하는 데이터베이스 와 관련된 메소드를 이용합니다.

db2

DB2 개발자로 로그인하여 JAVA 소스 파일을 작성합니다. 확장자는 java 로 지정합니다.


$ login DB2 개발자>
$ vi 소스파일명>.java
import java.sql.*;
class myjdbc {
static {
try {
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance
();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String argv[]) {
Connection con = null;
String url = "jdbc:db2:sample";
try {
con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * from employee");
System.out.print("Received results:\n\n");
while (rs.next()) {
String a = rs.getString(1);
String str = rs.getString(2);
System.out.print(" empno= " + a + " firstname= " + str + "\n");
}
rs.close();
stmt.close();
con.close();
} catch( Exception e ) {
e.printStackTrace();
}
}
}

Java 버전을 확인하십시오.


$ java -version
java version "1.3.1“
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1)

Java 버전에 맞는 컴파일러가 실행되고 있는지 확인하십시오


$ which javac
/usr/java13_64/bin/javac

PATH, CLASSPATH 환경 변수가 적절히 구성되었는지 확인하십시오.


$ echo $PATH $ echo $CLASSPATH

Javac 명령어로 컴파일합니다.


$ javac 소스파일명>.java

java 명령어로 자바 클래스 파일을 실행합니다. 실행 결과는 다음과 같습니다.


$ java 클래스파일명>
Received results:
empno=000010 firstname=CHRISTINE
empno=000020 firstname=MICHAEL
empno=000030 firstname=SALLY
empno=000050 firstname=JOHN
empno=000060 firstname=IRVING
empno=000070 firstname=EVA
empno=000090 firstname=EILEEN
empno=000100 firstname=THEODORE
empno=000110 firstname=VINCENZO
empno=000120 firstname=SEAN
empno=000130 firstname=DOLORES
empno=000140 firstname=HEATHER
empno=000150 firstname=BRUCE
empno=000160 firstname=ELIZABETH
empno=000170 firstname=MASATOSHI
empno=000180 firstname=MARILYN
empno=000190 firstname=JAMES
empno=000200 firstname=DAVID
empno=000210 firstname=WILLIAM
empno=000220 firstname=JENNIFER
empno=000230 firstname=JAMES
empno=000240 firstname=SALVATORE
empno=000250 firstname=DANIEL
empno=000260 firstname=SYBIL
empno=000270 firstname=MARIA
empno=000280 firstname=ETHEL
empno=000290 firstname=JOHN
empno=000300 firstname=PHILIP
empno=000310 firstname=MAUDE
empno=000320 firstname=RAMLAL
empno=000330 firstname=WING
empno=000340 firstname=JASON