本站不再更新,歡迎光臨 java開(kāi)發(fā)技術(shù)網(wǎng)
          隨筆-230  評(píng)論-230  文章-8  trackbacks-0

          共有4種構(gòu)方法構(gòu)造動(dòng)態(tài)SQL語(yǔ)句:
          1、方法一:
                 僅適用于非SELECT語(yǔ)句,且語(yǔ)句中不包含輸入宿主變量。格式如下
                 EXEC SQL EXECUTE  IMMEDIATE  :host_string  或
                  EXEC SQL EXECUTE  IMMEDIATE  "UPDATE XX SET NAME=yyyy  HERE ID=1"

          2、方法二:
            也只適用于非SELECT語(yǔ)句,SQL語(yǔ)句可包含虛擬輸入宿主變量和指示器變量,但它們的個(gè)數(shù)和數(shù)據(jù)類型在預(yù)編譯時(shí)必須是可知的。
                   處理分三步:
                  A、構(gòu)造一個(gè)動(dòng)態(tài)SQL語(yǔ)句。
                  B、用PREPARE 語(yǔ)句來(lái)分析和命名該動(dòng)態(tài)SQL語(yǔ)句
                  C、用EXECUTE 來(lái)執(zhí)行
               EXEC SQL PREPARE 用于分析一個(gè)動(dòng)態(tài)SQL,如
                  strcpy(sql_stmt,"DELETE FROM EMP  WHERE JOB=:v");
                   EXEC SQL PREPARE stmt FROM :sql_stmt;
              EXECUTE 語(yǔ)句格式:
               EXEC SQL FOR <行數(shù)> EXECUTE  <動(dòng)態(tài)語(yǔ)句> USING  <參數(shù)>
              EXEC SQL EXECUTE stmt USING :job;

          3、方法三:
               方法三只適用于SELECT語(yǔ)句,語(yǔ)句中包含選擇表項(xiàng)個(gè)數(shù),和虛擬輸入宿主變量個(gè)數(shù)在預(yù)編譯時(shí)都是已知的,但是數(shù)據(jù)庫(kù)的表、列名可能運(yùn)行時(shí)指定。步驟如下:
               1、定義動(dòng)態(tài)腳本。
               2、分析動(dòng)態(tài)腳本。
               3、定義游標(biāo),游標(biāo)的語(yǔ)句就是動(dòng)態(tài)分析的名。
               代碼例子:
                  strcpy(sql_stmt,"SELECT SID,ENAME FROM EMP  WHERE JOB=:v");
                   EXEC SQL PREPARE stmt FROM :sql_stmt;
                  EXEC SQL DECLARE cur FOR  stmt ;
                 然后遍歷游標(biāo):
               

          for(;;)
              {
                   EXEC SQL 
          for :n FETCH stud_cur  INTO :stud_id,:stud_age,:stud_n
          ame,:stud_addr;
                   rows
          =sqlca.sqlerrd[2];
          printf(
          "rows=%d\n",rows);
                   
          int i;
          if(sqlca.sqlcode<0) {
          printf(
          "ora err:%d",sqlca.sqlcode);
          break;
          }
          rows
          =sqlca.sqlerrd[2]-n*j;
                   
          for(i=0;i<rows;i++)
                   {
                        printf(
          "%d--%d--%s--%s\n",stud_id[i],stud_age[i],stud_name
          [i].arr,stud_addr[i].arr);
                   }
                   j
          ++;
                   printf(
          "currsor %d times\n",j);
          if ((sqlca.sqlcode == 1403) ) break;
              }

          上面遍因游標(biāo)是一次取N條記錄的,因?yàn)閟tud_id等是數(shù)組,n為數(shù)組長(zhǎng)度
          一個(gè)完整的動(dòng)態(tài)游標(biāo)例子

          #include <stdio.h>
          #include 
          <string.h>
          #include 
          <stdlib.h>
          EXEC SQL include sqlca;
          #ifdef TRUE
          #undef TRUE
          #endif

          #define TRUE 1

          EXEC ORACLE OPTION (RELEASE_CURSOR 
          = YES);
          EXEC SQL BEGIN DECLARE SECTION;
                          VARCHAR username[
          20];
                          VARCHAR password[
          20];

          EXEC SQL END DECLARE SECTION;


          void sql_error()
          {
              EXEC SQL WHENEVER SQLERROR CONTINUE;
              printf(
          "\n Oracle error detected:\n");
              printf(
          "\n%.70s\n",sqlca.sqlerrm.sqlerrmc);
              EXEC SQL ROLLBACK RELEASE;
              exit(
          1);
          }
          void dyna_cursor()
          {
              EXEC SQL BEGIN DECLARE SECTION;
                  
          char *sql_str;
                  
          int stud_id;
                  
          int stud_age;
                  VARCHAR stud_name[
          20];
                  VARCHAR stud_addr[
          60];
                  
          int vage;  
              EXEC SQL END   DECLARE SECTION;
              sql_str
          =(char *)malloc(400);
              vage
          =3;
              strcpy(sql_str,
          "SELECT STUD_ID,STUD_NAME FROM PROC_STUD WHERE STUD_A
          GE=:v1");
              EXEC SQL PREPARE S FROM :sql_str;
              EXEC SQL DECLARE C CURSOR  FOR S;
              printf(
          "please input age :\n");
              scanf(
          "%d",&vage);
              EXEC SQL OPEN C USING :vage;
              EXEC SQL WHENEVER NOT FOUND GOTO notfound;
              
          while(TRUE)
              {
                  EXEC SQL FETCH C INTO :stud_id,:stud_name;
                  
          /*stud_name.arr[stud_name.len]='\0';*/
                  
          /*stud_name.len=strlen(stud_name.arr);*/
                  printf(
          "%d\t%s\n",stud_id,stud_name.arr);
              }
           notfound:
              printf(
          "\nQuery Returned %d row %s\n",sqlca.sqlerrd[2],sql_str);
              EXEC SQL CLOSE C;
              EXEC SQL COMMIT RELEASE;
              printf(
          "Have a good day!\n");
              exit(
          0);
           sqlerror:
              printf(
          "%d %.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
              EXEC SQL WHENEVER SQLERROR CONTINUE;
              EXEC SQL CLOSE C;
              EXEC SQL ROLLBACK RELEASE;
              exit(
          1);
          }


          main()
          {
               strcpy(username.arr,
          "gdnum_true");
               strcpy(password.arr,
          "gdnumtrue_10");
               username.len
          =strlen(username.arr);
               password.len
          =strlen(password.arr);

               EXEC SQL CONNECT :username IDENTIFIED BY :password;
               printf(
          "sqlca.sqlcode=%d;\n",sqlca.sqlcode);
               printf(
          "login user=%s\n",username.arr);
               dyna_cursor();
               exit(
          0);
          }


             
          4、方法四

          posted on 2007-09-28 11:09 有貓相伴的日子 閱讀(6698) 評(píng)論(5)  編輯  收藏 所屬分類: unix/windows C 程序設(shè)計(jì)

          評(píng)論:
          # re: pro*c動(dòng)態(tài)SQL技術(shù) 2007-11-01 11:08 | HELLO
          方法4呢?
          其他的理解起來(lái)比較容易,但方法四試過(guò)幾次都沒(méi)有成功,你是否有成功的經(jīng)驗(yàn)可以分享一下?
          我的信箱:cuixiaoqian[AT]gmail.com  回復(fù)  更多評(píng)論
            
          # re: pro*c動(dòng)態(tài)SQL技術(shù) 2007-11-01 22:21 | 有貓相伴的日子
          @HELLO
          方法4,太復(fù)雜了!!!還沒(méi)用到過(guò)方法4,你要靜下心來(lái)慢慢看才能體會(huì)到  回復(fù)  更多評(píng)論
            
          # re: pro*c動(dòng)態(tài)SQL技術(shù) 2010-03-31 14:24 | niuniu
          # re: pro*c動(dòng)態(tài)SQL技術(shù) 2012-07-03 10:17 | lij
          學(xué)習(xí)  回復(fù)  更多評(píng)論
            
          # re: pro*c動(dòng)態(tài)SQL技術(shù) 2012-12-12 17:06 | barbara
          方法4 是什么,為什么看不到  回復(fù)  更多評(píng)論
            
          本站不再更新,歡迎光臨 java開(kāi)發(fā)技術(shù)網(wǎng)
          主站蜘蛛池模板: 灯塔市| 嘉禾县| 宣汉县| 湖口县| 桂阳县| 舟山市| 阜城县| 信阳市| 秦皇岛市| 昌平区| 平山县| 庆安县| 满城县| 乌拉特后旗| 陵水| 托克托县| 东明县| 中江县| 福州市| 黔西县| 花垣县| 宝兴县| 同仁县| 江都市| 宜君县| 吴江市| 云南省| 卢湾区| 汕尾市| 宣化县| 南昌县| 乌兰察布市| 南江县| 玉树县| 常德市| 海阳市| 焦作市| 大悟县| 横山县| 千阳县| 泸定县|