http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/oracle_proc_programing
http://www.joinc.co.kr/modules.php?name=News&file=article&sid=94&mode=nested&order=0&thold=0
Pro *C(ÀÌÇÏ proc) ´Â ÀÏÁ¾ÀÇ ÇÁ¸®ÄÄÆÄÀÏ·¯´Ù. Áï CÄڵ忡 ¿À¶óŬ°ü¸®¸¦ À§Çؼ ÀÏ»óÀûÀ¸·Î »ç¿ëÇÏ´Â SQL, PL/SQL µîÀ» °áÇÕ½ÃÄѼ ÄÚµùµÈ ÇÁ·Î±×·¥À» CÄÄÆÄÀÏ·¯(¿©±â¿¡¼´Â gcc)°¡ ÀνÄÇÒ¼ö ÀÖ´Â C ÄÚµå ÆÄÀÏ·Î º¯°æ½ÃÄÑÁÖ´Â ÀÏÀ» ÇÑ´Ù. ¿À¶óŬ¿¡¼´Â proc ¶ó´Â ÇÁ¸®ÄÄÆÄÀÏ·¯¸¦ Á¦°øÇÏ°í ÀÖ´Ù.
¾Æ¸¶µµ 1GL ÀÌ´Ï 2GL ÀÌ´Ï ÇÏ´Â ÇÁ·Î±×·¡¹Ö ¾ð¾î ¼¼´ë¸¦ ³ªÅ¸³»´Â ¸»¿¡ ´ëÇؼ µé¾î º¸¾ÒÀ»°ÍÀÌ´Ù. º¸Åë 1¼¼´ë ¾ð¾î, 2¼¼´ë ¾ð¾î¶ó´Â ½ÄÀ¸·Î ºÒ¸®´Âµ¥, ÀÌ ºÐ·ù¿¡ µû¸£¸é C ¾ð¾î´Â 3¼¼´ë ¾ð¾î(3GL)ÀÌ´Ù. ÀÌ¿¡ ¹ÝÇØ SQL(Structur query language) ¾ð¾î´Â 4¼¼´ë ¾ð¾î·Î½á, 3GL ¾ð¾î°¡ ÀýÂ÷½Ä ¾ð¾îÀε¥ ¹ÝÇؼ, 4¼¼´ë ¾ð¾î´Â Á»´õ ÀÚ¿¬¾î¿¡ ±ÙÁ¢ÇÑ ¾ð¾îÀû Ư¼ºÀ» °¡Áø´Ù.
ÀÌ·¯ÇÑ 4GL ¾ð¾î°¡ °¡Áö´Â ÀÚ¿¬¾î¿¡ ±ÙÁ¢ÇÑ Æ¯¼ºÀº ¾ð¾î »ç¿ëÀ» Á÷°üÀûÀÌ°í ½±°Ô ÇÒ¼ö ÀÖµµ·Ï ¸¸µé¾îÁÖÁö¸¸, ÀýÂ÷ÁöÇâ ÀûÀÎ ¾÷¹«¸¦ ó¸®Çϱ⿡´Â ±×¸® ÀûÇÕÇÏÁö°¡ ¾Ê´Ù. ±×·¡¼ ¸¹Àº °æ¿ì C, C++, JAVA µîÀÇ ¾ð¾îµé°ú °áÇÕÇؼ »ç¿ë ÇÏ°Ô µÈ´Ù.
±×·±µ¥ ´ë°ÔÀÇ °æ¿ì ÀÌ·¯ÇÑ 3GL¾ð¾î¿Í 4GL ¾ð¾îÀÇ °áÇÕ°úÁ¤Àº ²Ï³ª ¼º°¡½Å ÀÛ¾÷À̸ç, ¸¹Àº ½Ã°£À» ÇÊ¿ä·Î ÇÑ´Ù. SQL Àº º°µµ·Î ÇÏ°í, °Å±â¿¡ µ¡ºÙ¿©¼ ´Ù¾çÇÑ API µéÀ» »õ·Î ÀÍÇô¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×³ª¸¶ mysql, postgresql °ú °°Àº ºñ±³Àû ´Ü¼øÇÑ(¿À¶óŬ¿¡ ºñÇؼ) DBÀÇ °æ¿ì ¸î°¡Áö API ¸¸ ÀÍÈûÀ¸·Î½á ±×¸® ¾î·ÆÁö ¾Ê°Ô ÇÁ·Î±×·¡¹Ö ÇÒ¼ö ÀÖÁö¸¸, ¿À¶óŬÀÇ °æ¿ì »ó´çÇÑ ³ë·ÂÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ·¯ÇÑ Àú¼öÁØ¿¡¼ Á÷Á¢Á¢±ÙÀ» À§Çؼ Á¦°øÇÏ´Â°Ô OCI(Oracle Call Interface) ¶ó´Â API ¸ðÀ½ÀÌ´Ù.
±×·¡¼ ³ô´õ ³ôÀº ·¹º§¿¡¼ C ¾ð¾î¿Í SQL ¾ð¾î¸¦ °áÇÕÇؼ ÇÁ·Î±×·¡¹Ö ÇÒ¼ö Àִ ȯ°æÀ» Á¦°øÇÏ°íÀÚ ÇÏ´Â ¸ñÀû¿¡¼ ³ª¿Â°Ô ¹Ù·Î proc ÀÌ´Ù. proc ¼Ò¾²¸¦ º¸¸é ¾Ë°ÚÁö¸¸ º¹ÀâÇÑ API µé ´ë½Å¿¡ SQL ÀÇ ¹®ÀåÀ» ±×´ë·Î »ç¿ëÇÏ°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.
¶ÇÇÑ proc ´Â C ÄÚµå³×¿¡ PL/SQL ºí·°À» Á÷Á¢ ³Ö¾î¼ ÄÚµùÇÒ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù. PL/SQL Àº 4GL ¾ð¾îÀÇ ÀÚ¿¬¾îÀûÀΠƯ¼º¿¡ ÀýÂ÷½Ä ¾ð¾îÀÎ 3GL ¾ð¾îÀÇ Æ¯Â¡À» °áÇÕ½ÃŲ µµ±¸ÀÌ´Ù. PL/SQL ¿¡ ´ëÇÑ ³»¿ëÀº ÀÚ¼¼È÷ ´Ù·çÁö´Â ¾ÊÀ»°ÍÀ̸ç, ÇÊ¿äÇÒ°æ¿ì ¾à°£¾¿ ´Ù·çµµ·Ï ÇÏ°Ú´Ù. ¾î¶µç proc ¸¦ ÀÌ¿äÇÑ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ·Á¸é PL/SQL ¿¡ ¾î´ÀÁ¤µµ Àͼ÷ÇØÁú ÇÊ¿ä°¡ ÀÖ´Ù. PL/SQL Àº 4GL ¾ð¾îÀÇ Æ¯¼ºÀ» °¡Áö¹Ç·Î C, JAVA µî¿¡ ºñÇؼ ¸Å¿ì ½±°Ô ÀÍÈú¼ö ÀÖ´Ù.
ÀÏ´Ü ÇÁ·Î±×·¡¸Ó´Â SQL ¹®ÀÌ Æ÷ÇԵǾî ÀÖ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù. º¸ÅëÀÌ·¯ÇÑ ÄÚµå´Â È®ÀåÀÚ°¡ .pc ·Î µÇ¾îÀÖ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ .pc ÄÚµå´Â gcc ÄÄÆÄÀÏ·¯°¡ ÄÄÆÄÀÏ ÇÒ¼ö ¾øÀ½À¸·Î gcc °¡ ÀÌÇØÇÒ¼ö ÀÖ´Â .c ÄÚµå·Î º¯°æ½ÃÄÑÁÖ´Â "¼±ÇàÄÄÆÄÀÏ" °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ ¼±ÇàÄÄÆÄÀÏ·¯°Å .pc ÆÄÀÏÀ» .c ÄÚµå·Î º¯°æÇÑ ÀÌÈÄÀÇ ÄÄÆÄÀÏ °úÁ¤Àº ±âÁ¸ c ÄÄÆÄÀÏ °úÁ¤°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù.
+--------------+
| Proc Program | SQL ¹®À» Æ÷ÇÔ
| .pc |
+--------------+
¡é
+--------------+
| ¿À¶óŬ |
| ¼±ÇàÄÄÆÄÀÏ·¯ |
| proc |
+--------------+
¡é
+--------------+
| Çؼ®µÈ | ±âÁ¸ÀÇ SQL ¹®Àº library ¸¦
| .c ½î¾²ÄÚµå | Á÷Á¢ È£ÃâÇÏ´Â ¹®À¸·Î º¯°æµÊ
+--------------+
¡é
+--------------+
| C ÄÄÆÄÀÏ·¯ |
+--------------+
¡é
+--------------+
| Object ÆÄÀÏ |
+--------------+
¡é
+--------------+
| Linker | ¿À¶óŬ ¶óÀ̺귯¸®°¡ ¸µÅ©µÊ
+--------------+
¡é
+--------------+
| ½ÇÇàÆÄÀÏ |
+--------------+
|
´ÙÀ½Àº zipcode Å×ÀÌºí¿¡ ÃѸÀÇ ÀÚ·á°¡ µé¾îÀÖ´ÂÁö ¾Ë¾Æ¿À´Â ¾ÆÁÖ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
¿¹Á¦ : zipcode.pc
#include
#include
/* SQLCA ¸¦ ¼±¾ðÇÑ´Ù */
EXEC SQL INCLUDE SQLCA;
int main(int argc, char **argv)
{
/* ¼±¾ðºÎ */
EXEC SQL BEGIN DECLARE SECTION;
int count = 0;
char userid[40]= "system/manager@ORACLE";
EXEC SQL END DECLARE SECTION;
/* DB ¿¬°á */
EXEC SQL CONNECT :userid;
/* ¿¡·¯ ó¸® */
if (sqlca.sqlcode < 0)
{
printf("%s\n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(0);
}
/* Äõ¸® */
EXEC SQL SELECT count(*)
INTO: count
FROM zipcode;
/* Äõ¸® °á°ú¿¡ ´ëÇÑ ¿¡·¯Ã³¸® */
if (sqlca.sqlcode != 0)
{
EXEC SQL COMMIT WORK RELEASE;
return 0;
}
printf("¿ìÆíÁÖ¼Ò µ¥ÀÌŸ : %d °³\n", count);
/* DB ¿¬°á Á¾·á */
EXEC SQL COMMIT WORK RELEASE;
}
|
Äڵ带 º¸¸é ¾Ë°ÚÁö¸¸ ¹¹ º¹ÀâÇÏ°Ô ÀÌ°Í Àú°Í ÀÎŬ·çµå ½ÃÄÑÁÙ ÇÊ¿äµµ ¾ø°í, SQL ¹®ÀÌ °ÅÀÇ ±×´ë·Î ¾²¿©¼ ÀÌÇØÇϱ⵵ ¸Å¿ì ½±´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖÀ» °ÍÀÌ´Ù. Âü°í·Î ¿À¶óŬ proc ½î¾²ÆÄÀÏ¿¡¼ÀÇ ÁÖ¼®Àº /* */ ¸¸ »ç¿ë°¡´ÉÇÏ´Ù. // À» ½è´Ù°¡´Â ¿À·ù°¡ ¹ß»ýÇÑ´Ù.
À̹ø ¹®¼´Â ´ÜÁö ÀÌ·±½ÄÀ¸·Î ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÏ´Ù¶ó´Â Á¤µµ¸¸ º¸¿©ÁÙ °ÍÀÓÀ¸·Î À§ÀÇ ÄÚµåÀÇ ¼³¸íÀº »ý·«Çϵµ·Ï ÇÏ°Ú´Ù. ³ªÁß¿¡ ÀÚ¼¼È÷ ´Ù·çµµ·Ï ÇÏ°Ú´Ù.
¿ì¼± zipcode.pc ÆÄÀÏÀ» proc ¼±Çà ÄÄÆÄÀÏ·¯¸¦ ÀÌ¿ëÇؼ zipcode.c ÆÄÀÏÀ» ¾ò¾î³½´ÙÀ½ gcc¸¦ ÀÌ¿ëÇؼ object ÆÄÀÏÀ» ¸¸µé°í ¸µÅ©°úÁ¤À» °ÅÃļ ½ÇÇàÆÄÀÏÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ´ÙÀ½Àº ÀÌ·¯ÇÑ ÀÏ·ÃÀÇ °úÁ¤ÀÌ´Ù.
[oracle@localhost proc]$ proc zipcode INCLUDE=include/ \
> include=/usr/u01/product/8.1.7/precomp/public/ \
> include=/usr/u01/product/8.1.7/rdbms/demo/ \
> include=/usr/u01/product/8.1.7/rdbms/public/ \
> include=/usr/u01/product/8.1.7/network/public/ \
> PARSE=NONE RELEASE_CURSOR=YES MODE=ANSI
Pro*C/C++: Release 8.1.7.0.0 - Production on Thu Oct 31 00:29:15 2002
(c) Copyright 2000 Oracle Corporation. All rights reserved.
System default option values taken from: /usr/u01/product/8.1.7/precomp/admin/pcscfg.cfg
[oracle@localhost proc]$ gcc -c -o zipcode.o zipcode.c -I$ORACLE_HOME/precomp/public \
> -I$ORACLE_HOME/rdbms/demo -I$ORACLE_HOME/rdbms/public \
> -I$ORACLE_HOME/network/public
[oracle@localhost proc]$ gcc -o zipcode zipcode.o -L$ORACLE_HOME/lib -lclntsh
|
ÀÌ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°¸é ´ÙÀ½°ú °°Àº °á°ú°ªÀ» º¸¿©ÁÙ °ÍÀÌ´Ù.
[oracle@localhost proc]$ ./zipcode
¿ìÆíÁÖ¼Ò µ¥ÀÌŸ : 43476 °³
|
ÇÏÁö¸¸ À§ÀÇ ¹æ¹ý´ë·Î ¼öµ¿À¸·Î Äڵ带 ÄÄÆÄÀÏ ÇÏ´Â°Ç ºñ »ý»êÀûÀÎ ¹æ¹ýÀÌ´Ù. ±×·¯¹Ç·Î Makefile À» ¸¸µé¾î¼ °ü¸®Çϵµ·Ï ÇÏÀÚ.
Makefile
TARGET = zipcode
CC = gcc
PROC = proc
LIB = -L$(ORACLE_HOME)/lib -lclntsh
MYINC = include/
PROCINC = include=$(ORACLE_HOME)/precomp/public/ include=$(ORACLE_HOME)/rdbms/demo/ \
include=$(ORACLE_HOME)/rdbms/public/ \
include=$(ORACLE_HOME)/network/public/
CINC = -I$(ORACLE_HOME)/precomp/public/ -I$(ORACLE_HOME)/rdbms/demo/ \
-I$(ORACLE_HOME)/rdbms/public/ -I$(ORACLE_HOME)/network/public/
ORA_OPT = PARSE=NONE RELEASE_CURSOR=YES MODE=ANSI
CC_OPT =
OBJECT = zipcode.o
ORA_GARBAGE = *.dcl *.cod *.cud *.lis
######## implicit rules
.SUFFIXES: .pc .c
.pc.c:
$(PROC) $* INCLUDE=$(MYINC) $(PROCINC) $(ORA_OPT)
.c.o:
$(CC) -c -o $*.o $*.c -I $(MYINC) $(CINC)
####### build rules
all: $(TARGET)
$(TARGET): $(OBJECT)
$(CC) -o $(TARGET) $(OBJECT) $(LIB)
zipcode.c: zipcode.pc
zipcode.o: zipcode.c
clean:
rm -f $(TARGET) $(OBJECT) $(ORA_GARBAGE)
|
ÀÌÇØÇϴµ¥ Ưº°È÷ ¾î·Á¿òÀº ¾øÀ»°ÍÀ̶ó°í »ý°¢µÈ´Ù. Makefile ¿¡ ´ëÇÑ ³»¿ëÀº
make ¸¦ ÀÌ¿ëÇÑ ÇÁ·ÎÁ§Æ® °ü¸® (1)¸¦ Âü°íÇϵµ·Ï ÇÑ´Ù.
ÀÌ»ó proc ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ °¡Àå ±âº»ÀûÀΠȯ°æ¿¡ ´ëÇؼ ¾Ë¾Æº¸¾ÒÀ¸¸ç, ¾ÆÁÖ °£´ÜÇÑ ¿¹¸¦ µé¾î¼ proc ÇÁ·Î±×·¡¹ÖÀ» ¸Àº¸¾Ò´Ù. ´ÙÀ½¿¡´Â Á»´õ ÀÚ¼¼ÇÑ proc ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ³»¿ëÀ» ´Ù·çµµ·Ï ÇÏ°Ú´Ù.