/***************************************************************************************************************
esql*C 多线程实例,多个线程共享一个context
***************************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include "pthread.h"
#ifdef WIN32
#include <windows.h>
#define SLEEP(a) Sleep(a * 1000)
#else
#define SLEEP(a) sleep(a)
#endif
#define ERR_SQL(err) if( err < 0 ) \
{ \
sql_error(__LINE__); \
}
#define SQLCODE sqlca.sqlcode
pthread_mutex_t mutex;
int fres[10000];
int fcount;
static int fetch_data(sql_context context);
void sql_error(long line)
{
printf("EXPECTION at line:%ld\n",line);
printf("EXPECTION:%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
exit(-1);
}
//错误处理函数
void test_error(long line)
{
printf("EXPECTION at line:%ld\n",line);
exit(-1);
}
int main()
{
pthread_t tid1, tid2;
int res = 0;
EXEC SQL BEGIN DECLARE SECTION;
int i;
sql_context context;
char username[50];
char password[50];
char server[50];
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR CONTINUE;
fcount = 0;
EXEC SQL ENABLE THREADS;
EXEC SQL CONTEXT ALLOCATE :context;
EXEC SQL CONTEXT USE :context;
memset(username,0,sizeof(username));
memset(password,0,sizeof(password));
memset(server,0,sizeof(server));
strcpy(username,"sysdba");
strcpy(password,"szoscar55");
strcpy(server,"osrdb@127.0.0.1:2003");
EXEC SQL CONNECT TO :server USER :username IDENTIFIED BY :password;
ERR_SQL(SQLCODE);
/*创建表之前先删除已经存在的表*/
EXEC SQL DROP TABLE SHAREONECONN;
//ERR_SQL(SQLCODE);
res = pthread_mutex_init(&mutex, NULL);
if (res != 0)
{
test_error(__LINE__);
}
/*创建表*/
EXEC SQL CREATE TABLE SHAREONECONN (name varchar(256), age int);
if(SQLCODE == 0 )
{
printf("创建表SHAREONECONN (name varchar(256), age int) 成功!\n");
}
ERR_SQL(SQLCODE);
for( i=0; i<10; i++ )
{
EXEC SQL INSERT INTO SHAREONECONN VALUES ( 'test', :i );
ERR_SQL(SQLCODE);
}
EXEC SQL DECLARE cur_data CURSOR FOR SELECT age FROM SHAREONECONN ORDER BY age;
ERR_SQL(SQLCODE);
//打开游标
EXEC SQL OPEN cur_data;
ERR_SQL(SQLCODE);
// 创建两个线程
if( pthread_create( &tid1,NULL,(void*)fetch_data,(void*)context ) )
{
printf( "创建线程失败!\n" );
test_error(__LINE__);
}
if( pthread_create( &tid2,NULL,(void*)fetch_data,(void*)context ) )
{
printf( "创建线程失败!\n" );
test_error(__LINE__);
}
// 等待线程退出
if (pthread_join( tid1,NULL ) )
{
printf( "等待线程结束失败!\n" );
test_error(__LINE__);
}
if (pthread_join( tid2,NULL ) )
{
printf( "等待线程结束失败!\n" );
test_error(__LINE__);
}
EXEC SQL CLOSE cur_data;
EXEC SQL DROP TABLE SHAREONECONN;
EXEC SQL COMMIT WORK RELEASE;
ERR_SQL(SQLCODE);
EXEC SQL CONTEXT FREE :context;
ERR_SQL(SQLCODE);
exit(0);
}
static int fetch_data(sql_context context)
{
EXEC SQL BEGIN DECLARE SECTION;
int age;
EXEC SQL END DECLARE SECTION;
while(1)
{
if (10 <= fcount)
{
break;
}
pthread_mutex_lock(&mutex);
//取数据
EXEC SQL FETCH cur_data INTO :age;
ERR_SQL(SQLCODE);
fres[fcount] = age;
fcount++;
pthread_mutex_unlock(&mutex);
SLEEP(1);
}
return 0;
}