大家好,我想封装一个多线程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.   

    我初步的想法有两个,
    1、在main中定义一个sql_context的指针传递到logon中,然后在logon中使用sql_context初始化,可是却不知道怎么写,写出来的总是一运行就遇到问题需要关闭。
    2、把logon定义成sql_context的,然后将sql_context作为返回值返回,可是也是不会写。上面只是我的想法,但是由于自己不熟,周围也找不到对proc和C熟悉的人,一是不知道自己的想法对不对,另外也写不出实现的代码来,还望各位大侠帮帮忙,指点一下,谢谢各位了。
      

  2.   

    我也不太会用CONTEXT,帮不上忙,不好意思!等高手解答.....