원본 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>

, .