#include <stdio.h>
#include <sqlca.h>

void sqlerror();

EXEC SQL BEGIN DECLARE SECTION;
char *connstr = "scott/tiger";
char db_ename[30];
intdb_deptno;
EXEC SQL END DECLARE SECTION;

void main() {
EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC SQL WHENEVER SQLWARNING CONTINUE;
EXEC SQL CONNECT :connstr;

EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ENAME, DEPTNO
FROM EMP;

EXEC SQL OPEN emp_cursor;

EXEC SQL WHENEVER NOT FOUND DO break;
for (;;) {
EXEC SQL FETCH emp_cursor INTO :db_ename, :db_deptno;
printf("\t%s\t%i\n", db_ename, db_deptno);
}

EXEC SQL CLOSE emp_cursor;
EXEC SQL COMMIT WORK RELEASE;
return;
}

void sqlerror() {
printf("Stop Error:\t%25i\n", sqlca.sqlcode);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
return;
}

원본 http://blog.naver.com/julymorning4/100024943004

, .

원본 http://blog.naver.com/st95041/40001613322

예전에 comp76에서 작업한 예입니다. test.pc 에 있는 부분중 일부는 comp66의 현 상황에 맞게 고쳐져 있습니다. 참고하시길..


[dbhw00@comp76]/home/dbhw00/public_html/cgi-bin 52 > ls

proc.mk test.pc


[dbhw00@comp76]/home/dbhw00/public_html/cgi-bin 53 > proc test.pc


/* pc화일을 pre-compile한다. */

Pro*C/C++: Release 2.1.3.0.0 - Production on Mon Nov 24 21:15:18 1997

Copyright (c) Oracle Corporation 1979, 1994. All rights reserved.

System default option values taken from: /home/oracle/oracle7/proc/pmscfg.h

/* pre-compile 하면 c 화일이 생성된다 */


[dbhw00@comp76]/home/dbhw00/public_html/cgi-bin 54 > ls -al

total 5232

drwxr-xr-x 2 dbhw00 50000 512 Nov 24 21:15 ./

drwxr-xr-x 3 dbhw00 50000 512 Nov 24 21:06 ../

-rw--xr-x 1 dbhw00 50000 8115 Nov 24 18:41 proc.mk

-rw------- 1 dbhw00 50000 17835 Nov 24 21:15 test.c

-rw--xr-x 1 dbhw00 50000 3271 Nov 24 20:22 test.pc


/* 다음과 같이 make 하면 실행화일이 생성된다 */


[dbhw00@comp76]/home/dbhw00/public_html/cgi-bin 55 > make -f proc.mk EXE=test.cg

i OBJS=test.o

cc -I. -O -xcg92 -I/home/oracle/oracle7/sqllib/public -c test.c

ld -dy /home/oracle/oracle7/lib/crti.o /home/oracle/oracle7/lib/crt1.o /home/ora

cle/oracle7/lib/__fstd.o -R /opt/SUNWcluster/lib -Y P,/lib:/usr/lib:/usr/dt/lib:

/usr/openwin/lib:/usr/ucblib:/opt/SUNWcluster/lib:/usr/ccs/lib:/usr/lib -Qy -lc

/home/oracle/oracle7/lib/crtn.o -L/home/oracle/oracle7/lib -o test.cgi test.o -l

sql /home/oracle/oracle7/lib/osntab.o -lsqlnet -lora -lsqlnet -lpls -lora -lnlsr

tl3 -lc3v6 -lcore3 -lnlsrtl3 -lcore3 -lsocket -lnsl -lm -ldl -laio -lsocket -lns

l -lm -ldl -laio


[dbhw00@comp76]/home/dbhw00/public_html/cgi-bin 57 > ls -al

total 10416

drwxr-xr-x 2 dbhw00 50000 512 Nov 24 21:16 ./

drwxr-xr-x 3 dbhw00 50000 512 Nov 24 21:06 ../

-rw-r--r-- 1 dbhw00 50000 8115 Nov 24 18:41 proc.mk

-rw------- 1 dbhw00 50000 17835 Nov 24 21:15 test.c

-rwx------ 1 dbhw00 50000 2633868 Nov 24 21:16 test.cgi*

-rw------- 1 dbhw00 50000 7944 Nov 24 21:16 test.o

-rw-r--r-- 1 dbhw00 50000 3271 Nov 24 20:22 test.pc

------------------------------------------------------------------

test.pc 의 내용


#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <sys/types.h>

#include <time.h>


/* 각자의 id와 passwd로 수정 */

#define USERID "dbhw000"

#define PASSWD "dbhw000"


#define ORACLE_HOME_ENV "ORACLE_HOME=/usr/local/oracle"

#define ORACLE_SID_ENV "ORACLE_SID=ORA8"


void Print_html();

int DB_Task();

void error_out(char *msg1);


EXEC SQL INCLUDE sqlca;

EXEC SQL INCLUDE oraca;

EXEC ORACLE OPTION (ORACA=YES);

EXEC SQL BEGIN DECLARE SECTION;


int id;

VARCHAR name[20];

VARCHAR address[200];

VARCHAR phone[14];

VARCHAR email[100];

VARCHAR dbuid[20];

VARCHAR dbpwd[20];

VARCHAR servicename[20];

EXEC SQL END DECLARE SECTION;


main(){


/* 환경 변수 설정 부분 */

putenv(ORACLE_HOME_ENV);

putenv(ORACLE_SID_ENV);


/* html 문서임을 표시, \n이 2개 이상 */

printf("Content-type: text/html\n\n");


DB_Task();

Print_html();

exit(0);

}

/* DB 작업과 sqlca를 이용한 에러 처리 */

int DB_Task() {


int idnum;


/* ID, Passwd 설정 */

/* VARCHAR 타입은 문자열을 위한 arr과 문자열 길이를 위한 len으로 구성 */

strcpy(dbuid.arr, USERID); dbuid.len = strlen(USERID);

strcpy(dbpwd.arr, PASSWD); dbpwd.len = strlen(PASSWD);


/* DB 연결 */

EXEC SQL CONNECT :dbuid IDENTIFIED BY :dbpwd;


/* test 테이블로부터 id, ..., email을 검색하여 :id, ..., :email 에 대입 */

idnum = 1;

EXEC SQL SELECT id, name, address, email

INTO :id, :name, :address, :email

FROM test

WHERE id=:idnum;


if(sqlca.sqlcode!=0) {

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK RELEASE;


error_out("SQL문에 오류가 있습니다.");

return 1;

}


EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK RELEASE;


return 0;

}


/* DB 작업과 레이블을 이용한 에러 처리 */

int DB_Task(){


int idnum;


strcpy(dbuid.arr, USERID); dbuid.len = strlen(USERID);

strcpy(dbpwd.arr, PASSWD); dbpwd.len = strlen(PASSWD);


/* DB 작업중 에러 발생하면 ErrExit로 감 */

EXEC SQL WHENEVER SQLERROR GOTO ErrExit;

EXEC SQL CONNECT :dbuid IDENTIFIED BY :dbpwd;


idnum = 1;


EXEC SQL SELECT id, name, address, email

INTO :id, :name, :address, :email

FROM test

WHERE id=:idnum;

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK RELEASE;


return 0;


ErrExit:


EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK RELEASE;

error_out("시스템에 문제가 발생했습니다");

return 1;


}


void Print_html() {

printf("<html>\n");

printf("<head>\n");

printf("<title> Query 1 </title>\n");

printf("</head>\n");

printf("<body bgcolor=#ffffff >\n");

printf("<H1> <Center> <U> QUERY 1 </U> </Center> </H1>\n");

printf("<center>\n");

printf("<Table Border=1>\n");

printf("<Tr>\n");

printf("<Td> <Center> 구분 </Center> </td>\n");

printf("<Td > <center>내 용</center></td>\n");

printf("</tr>\n");

printf("<Tr>\n");

printf("<Td> <Center> ID </Center> </td>\n");

printf("<Td > %d</td>\n", id);

printf("</tr>\n");

printf("<Tr>\n");

printf("<Td> <Center> 이름 </Center> </td>\n");

printf("<Td > %s</td>\n", name.arr);

printf("</tr>\n");

printf("<Tr>\n");

printf("<Td> <Center> 주소 </Center> </td>\n");

printf("<Td > %s</td>\n", address.arr);

printf("</tr>\n");

printf("<Tr>\n");

printf("<Td> <Center> E-mail </Center> </td>\n");

printf("<Td > %s</td>\n", email.arr);

printf("</tr>\n");

printf("</Table>\n");

printf("</center>\n");

printf("<Hr Width=100%%>\n");

printf("<Center>\n");

printf("</body>\n");

}


comp66>/usr/loca/oracle/precomp/demo/proc 내에 있는 .pc 파일들을 참고할 것.


< 참고 문헌 >


Rick F. van der Lans, "Introduction to SQL", Addison-Wesley

Rick F. van der Lans, "The SQL Guide to ORACLE", Addison-Wesley

Jim Melton, "Understanding the new SQL", Morgan Kaufmann.

원래소스 http://dbmain.snu.ac.kr/courses/DB99/proc.html

, .

원본 http://blog.naver.com/st95041/40001613429

http://www.oraclejava.co.kr 의 PRO*C 에서..
CGI강좌로 된것이 있더군요... 몇회에 걸쳐서 되어 있는것을
나름 대로 정리해서 실습을 하고 검증 후 여러분들이 실습이
가능한 형태로 만들어 올려 봅니다.
앞으로 계속 몇회에 걸쳐 올리겠습니다.

이 강좌는 위 사이트에서 펀글을 위주로 하므로 저작에 대한 문제제기시
즉시 삭제 하겠습니다.

예제1 )
Web에서 Oracle DB에 접근하는 CGI(Common Gateway Interface)를
Oracle 에서 제공하는 Pro C로 만들어 봅시다.
Pro C는 C언어를 기본으로 하고 있으니 C만 아시면 쉽게 이해하실 수 있구요
cgi를 작성하기 위하여 cgic library를 이용합니다.
cgic library에 대한 구체적인 함수나 환경변수들에 대한 설명은 http://www.boutell.com/cgic 에 있습니다.

============================
http://www.boutell.com/cgic 에서 다운로드 받으면 cgic.h와 cgic.c가 나온다.
header(cgic.h) 파일은 include 디렉토리에 넣고.. (프로젝트에 자동 첨가됨)
cgic.c는 프로젝트에 add한다. (프로젝트에 수동 첨가해야함)
cgic.c나 cgic.h는 그대로 사용은 안될것이며 각자의 환경에 따라 path부분은
수정해 주어야 할 수 도 있다.
수정된 소스는 첨부하여 올린다.
===============================================================

다음 코드를 살펴보면... (PC 파일)

/*
아래의 테이블을 일단 만들어야 한다.

create table s_reg_db (
s_id number,
s_name varchar2(20),
s_age number,
s_sex number,
s_address varchar2(60),
s_telephone varchar2(20),
s_date date,
s_memo varchar2(400)
) */

#include <stdio.h>
#include <cgic.h>


#define USERNAME "scott"
#define PASSWORD "tiger"
#define DBSTRING "ora9i"

EXEC SQL BEGIN DECLARE SECTION;
// DB에 관련된 변수들을 선언
char *username = USERNAME;
char *password = PASSWORD;
char *dbstring = DBSTRING;
int count1;
VARCHAR re1[20];
int re2;
int re3;
VARCHAR re4[60];
VARCHAR re5[20];
VARCHAR re6[2000];
VARCHAR re7[8];
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE sqlca;
void sqlerror();
int getCgiParameter();
void setMemory ( void );

/* 반드시 cgiMain 으로 시작함*/
int cgiMain ( void )
{

int result;

//각자 수정 필요 부분
putenv("ORACLE_HOME=c:\\oracle\\ora92");

putenv("ORACLE_SID=ora9i");

putenv("NLS_LANG=AMERICAN_AMERICA.KO16KSC5601");

//putenv("LD_LIBRARY_PATH=/oracle/733/lib");


EXEC SQL WHENEVER SQLERROR DO sqlerror();

EXEC ORACLE OPTION(HOLD_CURSOR=NO);

EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbstring;


cgiHeaderContentType("text/html");
setMemory(); // 변수초기화
getCgiParameter(); // html에서 받은 입력자료를 위에서 선언한 변수로 대입시켜주는 함수

EXEC SQL SELECT to_char(SYSDATE,'YY-MM-DD') into re7 from sys.dual;

EXEC SQL SELECT NVL(max(S_ID),0) INTO :count1 FROM s_reg_db order by s_date;
count1++;
EXEC SQL INSERT INTO s_reg_db ( s_id , s_name , s_age , s_sex , s_address , s_telephone , s_date , s_memo )
VALUES ( :count1, :re1 , :re2 , :re3 , :re4 , :re5, SYSDATE , :re6 );
fprintf(cgiOut, "Insert ok\n");
fprintf(cgiOut, "끝!");
EXEC SQL COMMIT RELEASE;

//commit을 한 후 연결을 계속 유지시킨다. 만약 EXEC SQL COMMIT하면 연결을 끊는다.

return 0;
}


void sqlerror()
{ // DB error 처리

EXEC SQL WHENEVER SQLERROR CONTINUE;
fprintf(cgiOut, "ORACLE Error detected: \n");
fprintf(cgiOut, "% .70s \n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);

}


int getCgiParameter()
{
int result; char x[3];
result = cgiFormString ( "reg1", re1.arr , sizeof(re1.arr)); // reg1은 html에서 설정된 변수명

re1.len = strlen( (char *)re1.arr );
result = cgiFormString ( "reg4" , re4.arr , sizeof(re4.arr));
re4.len = strlen( (char *)re4.arr );
result = cgiFormString ( "reg5" , re5.arr , sizeof(re5.arr));
re5.len = strlen( (char *)re5.arr );
result = cgiFormString ( "reg6" , re6.arr , sizeof(re6.arr));
re6.len = strlen( (char *)re6.arr );
result = cgiFormString ( "reg2" , x , 3 );
re2 = atoi ( x ); result = cgiFormString ( "reg3" , x , 3 );
re3 = atoi ( x );
if ( result == cgiFormNotFound ) {
re3 = -1;
}
else {
re3 = atoi ( x );
}

fprintf(cgiOut," name : %s \n\n",re1.arr);
fprintf(cgiOut," age : %d\n\n",re2);
if ( re3 == 1 ) {
fprintf(cgiOut," sex : male\n");
}
else if ( re3 == 2 ) {
fprintf(cgiOut," sex : female\n");
}
fprintf(cgiOut," address : %s\n\n",re4.arr);
fprintf(cgiOut," telephone : %s\n\n",re5.arr);
fprintf(cgiOut,"memo : %s\n\n",re6.arr);
}


void setMemory ( void )
{

memset(re1.arr,0,sizeof(re1.arr)); // memset을 이용하여 문자열변수(varchar2)들을 초기화 해준다.

memset(re4.arr,0,sizeof(re4.arr));

memset(re5.arr,0,sizeof(re5.arr));

memset(re6.arr,0,sizeof(re6.arr));

memset(re7.arr,0,sizeof(re7.arr));

re2 = -1; re3 = -1; count1 = 0; // 숫자변수 초기화

}


컴파일되었다면 html은 아래와 같이 만들어서 APAHCH의
htdocs 디렉토리에 넣고
실행파일은 cgi-bin에 넣는다. web-browser를 돌려서
http://test20.html 을 실행한다.
각각 입력 후 submit한 다음
sqlplus 를 띄워 값이 insert 된는지 확인하라.

<html>

<body>

<form action=/cgi-bin/test20.exe method=post>

이름<input type=text name=reg1> <br>

나이<input type=text name=reg2><br>

성별<input type=text name=reg3> (male:1/female:2)<br>

주소<input type=text name=reg4><br>

전화<input type=text name=reg5><br>

메모<input type=text name=reg6><br>

<input type=submit value="완료">

</form>

</body>

</html>

, .


원본 http://blog.naver.com/st95041/40001613439

오늘은 게시판처럼 List를 Table로 보여주는 기능이 들어있는 cgi를 작성하여 보도록 하겠습니다.

이 소스는 첫번째 강좌의 cgic.c와 cgic.h를 필요로 합니다.
또한 이 소스 역시 제가 임의로 수정해서 올리는 것입니다.
물론 테스트 했습니다.
#include <stdio.h>

#include <cgic.h>

#define USERNAME "scott"
#define PASSWORD "tiger"

#define DBSTRING "ora9i"

#define NEXT 5 // 한화면에 5개의 개시물을 보여주기 위한 선언


EXEC SQL BEGIN DECLARE SECTION;

char *username = USERNAME;
char *password = PASSWORD;
char *dbstring = DBSTRING;

int re2;
int re3;

int page1,page2,page3;

int pagecount1;
int pagecount2;
int pagecount4;

int temp;
int allpage;

int i,j,flag1;
int id;
int xx;

VARCHAR re1[20];
VARCHAR re4[60];
VARCHAR re5[20];
VARCHAR re6[2000];
VARCHAR re7[10];
VARCHAR sqlstmt[200];

EXEC SQL END DECLARE SECTION;


EXEC SQL INCLUDE sqlca;

void sqlerror();
void setMemory ( );
void getCgiParameter();



int cgiMain ( void ) {
int nextflag = 0;
int prevflag = 0;
char nn[200];
char pr[200];

putenv("ORACLE_HOME=c:\\oracle\\ora92");
putenv("ORACLE_SID=ora9i");
putenv("NLS_LANG=AMERICAN_AMERICA.KO16KSC5601");
//putenv("LD_LIBRARY_PATH=/usr/oracle/733/lib");


EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC ORACLE OPTION(RELEASE_CURSOR=YES);
EXEC ORACLE OPTION(HOLD_CURSOR=NO);

EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbstring;

cgiHeaderContentType("text/html"); // web으로 보여줘야 하게 때문에 html라고 header에 정의

EXEC SQL SELECT count(*) INTO : allpage FROM s_reg_db;//총 개수를 allpage변수에 저장시킴

sprintf(sqlstmt.arr," select S_NAME , S_AGE , S_SEX , S_ADDRESS , S_TELEPHONE , to_char(S_DATE, 'yy/mm/dd') , S_MEMO, S_ID "
" from s_reg_db "
" order by S_DATE "); // list에 넣을 데이터를 query해옴


sqlstmt.len = strlen( (char *)sqlstmt.arr); // 이것 꼭 써줘야 올바르게 값이 나옵니다!!



/* 커서 설정 */

EXEC SQL PREPARE s_reg_result FROM :sqlstmt;

EXEC SQL DECLARE reg_cursor CURSOR for s_reg_result;

EXEC SQL OPEN reg_cursor;


/* 나이별로 검색하는 부분 - 다음시간에 할것임*/
fprintf(cgiOut,"<form action=/cgi-bin/test20.exe method=post>");
fprintf(cgiOut,"<h5>Age Search</h5>");

fprintf(cgiOut,"<input type=text name=st_age maxlength=5 size=10 >~<input type=text name=ed_age maxlength=5 size=10 >");
fprintf(cgiOut,"<br><p>");
fprintf(cgiOut,"<input type=hidden name=s value=1>");
fprintf(cgiOut,"<input type=hidden name=page value=1>");
fprintf(cgiOut,"<input type=text name=search1>");
fprintf(cgiOut,"<input type=submit value=search>");
fprintf(cgiOut,"</form>");


/* 웹에 보여주는 list table의 label을 작성하는 부분*/
fprintf(cgiOut,"<table border=1 width=100%>");
fprintf(cgiOut,"<tr>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Number");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Write Date");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Name");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Age");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Sex");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Address");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Telephone");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"Memo");
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"</tr>");


getCgiParameter(); // 페이지수를 받아오는 함수
if(page1 == NULL || page1 == 0) page1 = 1;

pagecount1 = page1; //현재 페이지.



pagecount2 = pagecount1 * NEXT; //pagecount2 = pagecount1 * 5; //

for ( i=1 ; i <= pagecount2 ; i++)
{
setMemory(); // 변수 초기화

if ( page1 > 1 && flag1==0)
{
for ( j=1 ; j<=((page1-1)*5) ; j++ )

{
EXEC SQL FETCH reg_cursor INTO :re1 , :re2 , :re3 , :re4 , :re5 , :re7 , :re6 , id; //위에서 만든 커서를 가지고 1개씩 row를 fetch해옴
}

i=j;

flag1=1;
}

EXEC SQL FETCH reg_cursor INTO :re1, :re2 , :re3, :re4, :re5, :re7, :re6, id;

if ( sqlca.sqlcode == 1403 ) /* 더 이상의 데이터가 없다면 중단하라는 문장 */
break;

/* 실제 query해온 data를 table에 찍어줌 */

fprintf(cgiOut,"<tr>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"%d",id);
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"%s",re7.arr);
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"%s",re1.arr);
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"%d",re2);
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");

if ( re3 == 1 ) {
fprintf(cgiOut,"Male");
}
else if ( re3 == 2 ) {
fprintf(cgiOut,"Female");
}
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"%s",re4.arr);
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"%s",re5.arr);
fprintf(cgiOut,"</font></td>");
fprintf(cgiOut,"<td>");
fprintf(cgiOut,"<font size=2>");
fprintf(cgiOut,"%s",re6.arr);
fprintf(cgiOut,"</font></td>");

}

fprintf(cgiOut,"</tr>");
fprintf(cgiOut,"</table>");
fprintf(cgiOut,"<br><p>");


EXEC SQL close reg_cursor;

if ( allpage == 0 ) exit(1);

page3 = page1;
if ( allpage > NEXT && allpage > (page1*NEXT))
{
flag1=0;
nextflag =1;
sprintf(nn," \\\<a href=/cgi-bin/test21.exe?page=%d>Next</a>",++page1); // Next를 눌렀을 때 자신의 cgi를 다시 호출하여 사용 */
page2=page1-1;
page3 = page2;
}

if ( allpage > 5 && (page3*5) >= 10)
{
flag1=0;
prevflag = 1;
sprintf(pr," \\\<a href=/cgi-bin/test21.exe?page=%d>Prev</a>",--page3);
}

if(prevflag == 1)
fprintf(cgiOut,"%s",pr);

if(nextflag == 1)
fprintf(cgiOut,"%s",nn); // Next를 눌렀을 때 자신의 cgi를 다시 호출하여 사용 */


fprintf(cgiOut," \\\ <a href=/test20.html>Write</a>");

return 0;
}


void sqlerror() {
EXEC SQL WHENEVER SQLERROR CONTINUE;

fprintf(cgiOut, "ORACLE Error detected:<BR>\n");
fprintf(cgiOut, "% .70s <BR>\n", sqlca.sqlerrm.sqlerrmc);

EXEC SQL ROLLBACK WORK RELEASE;

exit(1);
}


void setMemory ( ) { /* 변수초기화*/

memset(re1.arr,0,sizeof(re1.arr));
memset(re4.arr,0,sizeof(re4.arr));
memset(re5.arr,0,sizeof(re5.arr));
memset(re6.arr,0,sizeof(re6.arr));
memset(re7.arr,0,sizeof(re7.arr));

re2=NULL;
re3=NULL;

id=NULL;
}


void getCgiParameter() { /* page값을 받아옴 */
int result;
char x[3];

result = cgiFormString ("page",x,3);
page1 = atoi (x);

}

, .