DB2SQC_TEST.BAT
@ECHO OFF REM ------------------------------------------------------------------------- REM - REM - DB2 환경변수 설정 REM - REM ------------------------------------------------------------------------- SET "SQLLIB_DIR=C:\Program Files\IBM\SQLLIB" SET "CLASSPATH=%SQLLIB_DIR%\java\db2java.zip;%SQLLIB_DIR%\java\db2jcc4.jar;%SQLLIB_DIR%\java\sqlj4.zip;%SQLLIB_DIR%\java\db2jcc_license_cu.jar;%SQLLIB_DIR%\bin;%SQLLIB_DIR%\java\common.jar;.;.;%CLASSPATH%" SET "DB2CLP=DB20FADE" SET "DB2INSTANCE=DB2" SET "DB2PATH=%SQLLIB_DIR%" SET "INCLUDE=%SQLLIB_DIR%\INCLUDE;%INCLUDE%" SET "LIB=%SQLLIB_DIR%\LIB;%LIB%" SET "Path=%SQLLIB_DIR%\BIN\..\db2tss\bin;%SQLLIB_DIR%\BIN;%SQLLIB_DIR%\FUNCTION;C:\Program Files\ibm\gsk8\lib64;C:\Program Files (x86)\ibm\gsk8\lib;%Path%" SET SRC_NAME=SQCTEST @ECHO ON REM ------------------------------------------------------------------------- REM - REM - DB2 시작 및 데이터베이스 생성 REM - REM ------------------------------------------------------------------------- DB2 DB2START DB2 CREATE DATABASE %SRC_NAME% REM ------------------------------------------------------------------------- REM - REM - DB2 접속 후 C언어로 변환 REM - REM ------------------------------------------------------------------------- DEL %SRC_NAME%.C DB2 CONNECT TO %SRC_NAME% DB2 PREP %SRC_NAME%.SQC BINDFILE REM ------------------------------------------------------------------------- REM - REM - C코드 컴파일 REM - make는 반드시 GnuWin32 make를 사용한다. REM - http://gnuwin32.sourceforge.net/packages/make.htm REM - REM ------------------------------------------------------------------------- RMDIR DB2PATH MKLINK /D DB2PATH "%DB2PATH%" sourceanalyzer.exe -b test -clean sourceanalyzer.exe -b test -64 -Xmx4096m -logfile sca1.log make -f Makefile sourceanalyzer.exe -b test -64 -Xmx4096m -logfile sca2.log -scan -f %SRC_NAME%.fpr REM ------------------------------------------------------------------------- REM - REM - DB2 접속 종료 및 불필요한 파일 삭제 REM - REM ------------------------------------------------------------------------- RMDIR DB2PATH DB2 CONNECT RESET REM DB2 DROP DATABASE %SRC_NAME% REM DB2 DB2STOP
Makefile
$(SRC_NAME).o : $(SRC_NAME).c gcc -IDB2PATH/include -Wno-stringop-overflow -c -o $(SRC_NAME).o $(SRC_NAME).c clean: del *.c *.o
SQCTEST.SQC
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sqlenv.h> #include <sqlutil.h> EXEC SQL BEGIN DECLARE SECTION; short id; char name[10]; short dept; double salary; char hostVarStmtDyn[50]; EXEC SQL END DECLARE SECTION; int main() { int rc = 0; EXEC SQL INCLUDE SQLCA; /* connect to the database */ printf("\n Connecting to database..."); EXEC SQL CONNECT TO "sample"; if (SQLCODE <0) { printf("\nConnect Error: SQLCODE = %d. \n", SQLCODE); goto connect_reset; } else { printf("\n Connected to database.\n"); } /* execute an SQL statement (a query) using static SQL; copy the single row of result values into host variables*/ EXEC SQL SELECT id, name, dept, salary INTO :id, :name, :dept, :salary FROM staff WHERE id = 310; if (SQLCODE <0) { printf("Select Error: SQLCODE = %d. \n", SQLCODE); } else { /* print the host variable values to standard output */ printf("\n Executing a static SQL query statement, searching for\n the id value equal to 310\n"); printf("\nID Name DEPT Salary\n"); printf(" %d %s %d %f\n", id, name, dept, salary); } strcpy(hostVarStmtDyn, "UPDATE staff SET salary = salary + 1000 WHERE dept = ?"); /* execute an SQL statement (an operation) using a host variable and DYNAMIC SQL*/ EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn; if (SQLCODE <0) { printf("Prepare Error: SQLCODE = %d. \n", SQLCODE); } else { EXEC SQL EXECUTE StmtDyn USING :dept; } if (SQLCODE <0) { printf("Execute Error: SQLCODE = %d. \n", SQLCODE); } /* Read the updated row using STATIC SQL and CURSOR */ EXEC SQL DECLARE posCur1 CURSOR FOR SELECT id, name, dept, salary FROM staff WHERE id = 310; if (SQLCODE <0) { printf("Declare Error: SQLCODE = %d. \n", SQLCODE); } EXEC SQL OPEN posCur1; EXEC SQL FETCH posCur1 INTO :id, :name, :dept, :salary ; if (SQLCODE <0) { printf("Fetch Error: SQLCODE = %d. \n", SQLCODE); } else { printf(" Executing an dynamic SQL statement, updating the\n salary value for the id equal to 310\n"); printf("\n ID Name DEPT Salary\n"); printf(" %d %s %d %f\n", id, name, dept, salary); } EXEC SQL CLOSE posCur1; /* Commit the transaction */ printf("\n Commit the transaction.\n"); EXEC SQL COMMIT; if (SQLCODE <0) { printf("Error: SQLCODE = %d. \n", SQLCODE); } /* Disconnect from the database */ connect_reset : EXEC SQL CONNECT RESET; if (SQLCODE <0) { printf("Connection Error: SQLCODE = %d. \n", SQLCODE); } return 0; } /* end main */