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

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

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

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

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

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

    3、方法三:
         方法三只適用于SELECT語句,語句中包含選擇表項(xiàng)個數(shù),和虛擬輸入宿主變量個數(shù)在預(yù)編譯時都是已知的,但是數(shù)據(jù)庫的表、列名可能運(yùn)行時指定。步驟如下:
         1、定義動態(tài)腳本。
         2、分析動態(tài)腳本。
         3、定義游標(biāo),游標(biāo)的語句就是動態(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ù)組長度
    一個完整的動態(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 有貓相伴的日子 閱讀(6689) 評論(5)  編輯  收藏 所屬分類: unix/windows C 程序設(shè)計

    評論:
    # re: pro*c動態(tài)SQL技術(shù) 2007-11-01 11:08 | HELLO
    方法4呢?
    其他的理解起來比較容易,但方法四試過幾次都沒有成功,你是否有成功的經(jīng)驗(yàn)可以分享一下?
    我的信箱:cuixiaoqian[AT]gmail.com  回復(fù)  更多評論
      
    # re: pro*c動態(tài)SQL技術(shù) 2007-11-01 22:21 | 有貓相伴的日子
    @HELLO
    方法4,太復(fù)雜了!!!還沒用到過方法4,你要靜下心來慢慢看才能體會到  回復(fù)  更多評論
      
    # re: pro*c動態(tài)SQL技術(shù) 2010-03-31 14:24 | niuniu
    look  回復(fù)  更多評論
      
    # re: pro*c動態(tài)SQL技術(shù) 2012-07-03 10:17 | lij
    學(xué)習(xí)  回復(fù)  更多評論
      
    # re: pro*c動態(tài)SQL技術(shù) 2012-12-12 17:06 | barbara
    方法4 是什么,為什么看不到  回復(fù)  更多評論
      
    本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
    主站蜘蛛池模板: 区久久AAA片69亚洲| 亚洲a∨无码男人的天堂| 久久久久成人片免费观看蜜芽| 亚洲成人精品久久| 日韩欧毛片免费视频| 色九月亚洲综合网| 亚洲阿v天堂在线| 成人免费视频一区| 一区二区视频免费观看| 亚洲欧洲在线观看| 国产成人免费a在线资源| 成人精品视频99在线观看免费| 亚洲国产成人综合| 国产精品亚洲不卡一区二区三区| 亚洲免费在线观看视频| 鲁啊鲁在线视频免费播放| 亚洲成人午夜在线| 亚洲男人第一无码aⅴ网站| 亚洲一级毛片免费观看| 一级一片免费视频播放| 亚洲日本在线电影| 亚洲专区先锋影音| 亚洲熟妇少妇任你躁在线观看无码| 67pao强力打造国产免费| 人成电影网在线观看免费| 国产99在线|亚洲| 美女免费视频一区二区| 免费国产在线视频| 香蕉97碰碰视频免费| 国产精品亚洲自在线播放页码| 亚洲国产成人高清在线观看 | 国产精品免费一区二区三区| 亚洲一区二区三区久久久久| 亚洲区小说区图片区QVOD| 日本特黄特黄刺激大片免费| 1000部夫妻午夜免费| 久久九九全国免费| 青青草国产免费国产是公开| 亚洲欧美日韩中文高清www777| 亚洲美免无码中文字幕在线| 亚洲s色大片在线观看|