動態SQL小結

服務器的連接:

//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;  

發佈了79 篇原創文章 · 獲贊 17 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章