Oracle Cursor¸¦ ÀÌ¿ëÇÑ Recursive Query ±¸Çö
since 10 March, 1999 last modified 10 March, 1999
Oracle CursorÀ» ÀÌ¿ëÇÏ¿© Recursive Logic À» ±¸Çö
- Bill Of Material »óÀÇ ´ÜÀ§ºÎÇ°°ú Á¶¸³ºÎÇ° »çÀÌÀÇ »óÇÏ°ü°è Ç¥Çö
- SQL ÀÚü´Â ÀϹÝÀûÀÎ Recursive Query°¡ ºÒ°¡ÇϹǷΠN °èÃþÀÇ ÇÏÀ§ ºÎÇ° °Ë»ö ºÒ°¡
- DB ApplicationÀ» »ç¿ëÇÒ °æ¿ì Cursor °¡ Recursive CallÀ» Áö¿øÇÏÁö ¸øÇÔ (ORACLE 7.3.3)
- C Program Language°¡ Recursive CallÀÌ °¡´ÉÇϹǷΠÀ̸¦ ÀÌ¿ëÇÏ¿© ±¸Çö (tree_nav() function ÂüÁ¶)
/* ----------------------------------------- navi.pc 1999.3.9 by Namchul Do navigate all the sub parts in VPM database It uses part_list and $EXT tables -------------------------------------------*/ #include#include #include #include #include /* Oracle error code for 'table or view does not exist'. */ #define NON_EXISTENT -942 void do_connect(); void sql_error(); void tree_nav(); void indent(); /*========================== Tree navigation */ void tree_nav(part_nbr,level) char *part_nbr; int level; { char s_part_no [12]; char *part_no_list[100]; int i = 0; int count = 0; printf("%d %s \n",level part_nbr); EXEC SQL VAR s_part_no is string(12); EXEC SQL whenever sqlerror do sql_error("tree_nav"); EXEC SQL declare key_cursor cursor for SELECT c.s_part_no FROM parts.part_list a, parts."$EXT" b, parts.part_list c WHERE a.s_part_no = :part_nbr AND a."$COID"=b."$COID" AND b."$COID_REF"=c."$COID" AND b."$TYPE" ='CATASS'; EXEC SQL open key_cursor; while(1) { EXEC SQL whenever not found do break; i=i+1; EXEC SQL fetch key_cursor into :s_part_no; part_no_list[i]=malloc(12); strcpy(part_no_list[i],s_part_no); } count=i; EXEC SQL whenever not found continue; EXEC SQL close key_cursor; i=0; for(i=1;i < count;i=i+1) { tree_nav(part_no_list[i],level+1); } } /*======================== Indentation */ void indent(level) int level; { int i; for (i=0 ; i < level ; i++) printf("+"); } /*======================== MAIN PROGRM BEGINES ========================*/ main(argc, argv) int argc; char **argv; { do_connect(); tree_nav(argv[1],0); EXEC SQL commit work release; } /* ============================ Connect to the database. */ void do_connect() { /* Note this declaration: uid is a char * * pointer, so Oracle will do a strlen() on it * at runtime to determine the length. */ char *uid = "parts/parts"; EXEC SQL whenever sqlerror do sql_error("Connect"); EXEC SQL connect :uid; printf("Connected.\n"); } /* ============================ Generic error handler. */ void sql_error(routine) char *routine; { char message_buffer[512]; size_t buffer_size; size_t message_length; /* Turn off the call to sql_error() to avoid * a possible infinite loop. */ EXEC SQL WHENEVER SQLERROR CONTINUE; printf("\nOracle error while executing %s!\n", routine); /* Use sqlglm() to get the full text of the error message. */ buffer_size = sizeof(message_buffer); sqlglm(message_buffer, &buffer_size, &message_length); printf("%.*s\n", message_length, message_buffer); EXEC SQL ROLLBACK WORK RELEASE; exit(1); }
Korean Engineering Databases © copyright Namchul Do, 1999