- 论坛徽章:
- 0
|
我想封装一个多线程proc函数,希望是封装好后调用者不需要再写sql_context来分配上下文运行环境就可以写出线程安全的访问Oracle的C程序。
举个简单的(去掉了select和fetch函数的)例子,最下面是我写的登录和登出数据库的程序,我想把- EXEC SQL BEGIN DECLARE SECTION;
- sql_context ctx;
- EXEC SQL END DECLARE SECTION;
- EXEC SQL ENABLE THREADS;
- EXEC SQL CONTEXT ALLOCATE :ctx;
复制代码 放到函数logon中,这样封装完后,别人再调用的时候就不需要考虑手动分配sql_context的问题了。
logon和logoff会同时执行很多遍,由于是在别的程序中调用,所以可以调用的时候给他们传递一个参数作为运行环境,但是我发现如果不在main中定义sql_context的话,logoff就拿不到我在logon中分配的运行环境,拜求proc达人给点指导,谢谢了。- #include <sqlca.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sqlda.h>
- #include <sqlcpr.h>
- #include <oci.h>
- void err_report();
- void logon();
- void logoff();
- /*****************************************************************
- * Function: logon
- *
- * Description: Logs on to the database as USERNAME/PASSWORD
- *
- *****************************************************************/
- void logon(ctx,connect_info)
- EXEC SQL BEGIN DECLARE SECTION;
- sql_context ctx;
- char * connect_info;
- EXEC SQL END DECLARE SECTION;
- {
- EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);
- EXEC SQL CONTEXT USE :ctx;
- EXEC SQL CONNECT :connect_info;
- printf("Connected!\n");
- }
- /******************************************************************
- * Function: logoff
- *
- * Description: This routine logs off the database
- *
- ******************************************************************/
- void logoff(ctx)
- sql_context ctx;
- {
- EXEC SQL WHENEVER SQLERROR DO err_report(sqlca);
- EXEC SQL CONTEXT USE :ctx;
- EXEC SQL COMMIT WORK RELEASE;
- printf("Logged off!\n");
- }
- /*****************************************************************
- * Function: err_report
- *
- * Description: This routine prints out the most recent error
- *
- ****************************************************************/
- void err_report(sqlca)
- //EXEC SQL BEGIN DECLARE SECTION;
- struct sqlca sqlca;
- //EXEC SQL END DECLARE SECTION;
- {
- if (sqlca.sqlcode < 0)
- printf("\n%.*s\n\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
- //printf ("wrong\n");
- exit(1);
- }
- int main()
- {
- EXEC SQL BEGIN DECLARE SECTION;
- sql_context ctx;
- EXEC SQL END DECLARE SECTION;
- EXEC SQL ENABLE THREADS;
- EXEC SQL CONTEXT ALLOCATE :ctx;
- logon(ctx,"test/test@paysys1");
- logoff(ctx);
- }
复制代码 我初步的想法有两个,
1、在main中定义一个sql_context的指针传递到logon中,然后在logon中使用sql_context初始化,可是却不知道怎么写,写出来的总是一运行就遇到问题需要关闭。
2、把logon定义成sql_context的,然后将sql_context作为返回值返回,可是也是不会写。
上面只是我的想法,但是由于自己不熟,周围也找不到对proc和C熟悉的人,一是不知道自己的想法对不对,另外也写不出实现的代码来,还望各位大侠帮帮忙,指点一下,谢谢各位了。 |
|