服務器的連接:
//connect to local database 連接服務器 szUsrId爲用戶名 szUsrPwd爲密碼 con_local 連接代名詞 szSrv爲數據源 結構爲如 192.168.1.1;9000 ip加端口
exec sql CONNECT :szUsrId IDENTIFIED BY :szUsrPwd at :con_local using :szSrv;
exec sql CONNECT :szUsrId2 IDENTIFIED BY :szUsrPwd2 at :con_remote using :szSrv2;
exec sql set close on endtran off;
exec sql disconnect all;
SQL操作(sql循環遊標提取數據事例)
// 說明SQL變量
exec sql begin declare section;
CS_CHAR task_id[2048];
CS_INT task_ref_id;
CS_INT task_status;
exec sql end declare section;
memset(szSQLString,0,sizeof(szSQLString));
sprintf(szSQLString,"select task_id,task_ref_id,task_status from aex_int_task where task_status = 3",szModule);
exec sql at :con_local prepare mod_pre from :szSQLString;/*準備SQL語句*/// 用PREPARE語句分析當前的動態sql語句,語句名是mod_pre
exec sql at :con_local declare mod_cursor cursor for mod_pre;//申明遊標mod_pre的遊標名爲mod_cursor
if(Check_Error(szSQLString,__LINE__,__FILE__)==1)
{
exec sql rollback;
return -1;
}
exec sql at :con_local open mod_cursor; //打開遊標
if(Check_Error(szSQLString,__LINE__,__FILE__)==1)
{
exec sql rollback;
return -1;
}
exec sql at :con_local fetch mod_cursor into :task_id,:task_ref_id, :task_status;//從遊標中提取SQL所執行的數據
while(sqlca.sqlcode == 0)//循環執行遊標 循環提取數據
{
//數組處理 存放在內存數據空間
strcpy(aex_int_task_List[aex_int_task_ListCount].task_id,task_id);
aex_int_task_List[aex_int_task_ListCount].task_ref_id=task_ref_id;
aex_int_task_List[aex_int_task_ListCount].task_status=task_status;
WriteLog(__LINE__,"task_ref_id=%d,task_status=%d\n",task_ref_id,task_status);
aex_int_task_ListCount++;
exec sql at :con_local fetch mod_cursor into :task_id,:task_ref_id, :task_status;
}
exec sql at :con_local close mod_cursor;/*關閉遊標*/
exec sql at :con_local deallocate cursor mod_cursor;/*銷燬遊標*/
SQL操作(sql提取數據事例)
memset(szSQLString,0,sizeof(szSQLString));
sprintf(szSQLString,"select isnull(sum(case result_flag when 1 then 1 else 0 end),0) as sccuess, isnull(sum(case result_flag when 2 then 1 else 0 end),0) as fail from pub_cmd_result where log_code='%s' and result_module='aex'",str_task_id);
exec sql at :con_remote prepare count_flag_pre from :szSQLString;
if(Check_Error(szSQLString,__LINE__,__FILE__)==1)
{
exec sql at :con_remote rollback;
return -1;
}
exec sql at :con_remote execute count_flag_pre into :successSQL,:failSQL;//獲取成功數和失敗數
exec sql at :con_remote commit;//提交事務
SQL操作(sql獲取數據參數事例)
// 說明SQL變量
EXEC SQL BEGIN DECLARE SECTION;
char* username=USERNAME;
char* password=PASSWORD;
VARCHAR sqlstmt[80];
int emp_number;
VARCHAR emp_name[15];
VARCHAR job[50],job1[50],job2[50];
float salary;
EXEC SQL END DECLARE SECTION;
//EXEC SQL CONNECT :username IDENTIFIED BY :password;
// 構造動態SQL語句
sqlstmt.len=sprintf(sqlstmt.arr,"INSERT INTO EMP(EMPNO,ENAME,JOB,SAL)VALUES(:V1,:V2,:V3,:V4)");
// 用PREPARE語句分析當前的動態INSERT語句,語句名是S
EXEC SQL PREPARE S FROM :sqlstmt;
// 循環插表
for(;;)
{
printf("/nEnter employee number:"); scanf("%d",&emp_number);
printf("/nEnter employee name:"); scanf("%s",&emp_name.arr);
emp_name.len=strlen(emp_name.arr);
printf("/nEnter employee job:"); scanf("%s",&job.arr); job.len=strlen(job.arr);
salary = 0; // With VC6, Missing this line will cause C Run-Time Error R6002.
printf("/nEnter salary:"); scanf("%f",&salary);
EXEC SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary; //獲取參數
}
EXEC SQL COMMIT RELEASE; // 提交事務
// 回滾事務,退出ORACLE
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK RELEASE;