<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    本站不再更新,歡迎光臨 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 有貓相伴的日子 閱讀(6688) 評論(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 是什么,為什么看不到  回復  更多評論
      
    本站不再更新,歡迎光臨 java開發技術網
    主站蜘蛛池模板: 最近的免费中文字幕视频| 最近中文字幕大全中文字幕免费| 成年午夜视频免费观看视频| 亚洲视频网站在线观看| 老汉精品免费AV在线播放| 亚洲国产人成在线观看69网站 | 亚洲国产成人五月综合网| 国产精品亚洲专区在线播放| 国产成人高清精品免费鸭子| 亚洲欧美日韩一区二区三区在线| 无码一区二区三区免费视频| 亚洲日本一线产区和二线产区对比| 成年在线观看网站免费| 亚洲第一街区偷拍街拍| 免费网站看v片在线香蕉| 亚洲一级Av无码毛片久久精品| 老妇激情毛片免费| 中文亚洲成a人片在线观看| 亚洲免费观看网站| 无码国产精品久久一区免费| 亚洲中文无码卡通动漫野外| 国产一级淫片视频免费看| 一区二区视频免费观看| 好看的电影网站亚洲一区| 18女人毛片水真多免费| 亚洲av无码片在线观看| 怡红院免费的全部视频| 亚洲美女激情视频| 免费视频中文字幕| 中文在线日本免费永久18近| 久久久久亚洲AV无码麻豆| 日韩免费高清播放器| 亚洲综合色丁香麻豆| 岛国片在线免费观看| 久久久受www免费人成| 中文字幕在线观看亚洲| 日韩中文无码有码免费视频 | 免费一级全黄少妇性色生活片 | 亚洲一级毛片在线观| 四虎免费久久影院| 一级毛片aaaaaa免费看|