本站不再更新,歡迎光臨 java開發技術網
          隨筆-230  評論-230  文章-8  trackbacks-0

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

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

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

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

          上面遍因游標是一次取N條記錄的,因為stud_id等是數組,n為數組長度
          一個完整的動態游標例子

          #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 有貓相伴的日子 閱讀(6700) 評論(5)  編輯  收藏 所屬分類: unix/windows C 程序設計

          評論:
          # re: pro*c動態SQL技術 2007-11-01 11:08 | HELLO
          方法4呢?
          其他的理解起來比較容易,但方法四試過幾次都沒有成功,你是否有成功的經驗可以分享一下?
          我的信箱:cuixiaoqian[AT]gmail.com  回復  更多評論
            
          # re: pro*c動態SQL技術 2007-11-01 22:21 | 有貓相伴的日子
          @HELLO
          方法4,太復雜了!!!還沒用到過方法4,你要靜下心來慢慢看才能體會到  回復  更多評論
            
          # re: pro*c動態SQL技術 2010-03-31 14:24 | niuniu
          look  回復  更多評論
            
          # re: pro*c動態SQL技術 2012-07-03 10:17 | lij
          學習  回復  更多評論
            
          # re: pro*c動態SQL技術 2012-12-12 17:06 | barbara
          方法4 是什么,為什么看不到  回復  更多評論
            
          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(32)

          隨筆分類(222)

          隨筆檔案(224)

          文章分類(4)

          文章檔案(7)

          相冊

          收藏夾(4)

          最新評論

          閱讀排行榜

          評論排行榜

          本站不再更新,歡迎光臨 java開發技術網
          主站蜘蛛池模板: 建德市| 朔州市| 大理市| 常州市| 靖江市| 大名县| 德阳市| 扎赉特旗| 通城县| 体育| 潜山县| 临清市| 巧家县| 遵义县| 丹寨县| 竹溪县| 荣昌县| 封丘县| 抚松县| 柳林县| 民乐县| 临桂县| 沛县| 水富县| 南召县| 广西| 孝感市| 大同市| 商城县| 策勒县| 阳新县| 临潭县| 七台河市| 尼木县| 石林| 洪泽县| 大悟县| 弥勒县| 类乌齐县| 陇西县| 南丹县|