<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免费看| 一级成人毛片免费观看| 亚洲精品GV天堂无码男同| 亚洲制服丝袜精品久久| 久久精品国产亚洲夜色AV网站| 亚洲精品高清一二区久久| 好吊妞视频免费视频| 成人福利免费视频| 免费在线看黄的网站| 国产A∨免费精品视频| 性色av极品无码专区亚洲| 亚洲综合成人婷婷五月网址| 亚洲欧洲精品在线| 91情国产l精品国产亚洲区| 亚洲国产精品久久久天堂| 国产午夜亚洲精品午夜鲁丝片| 亚洲精品国产va在线观看蜜芽| 国产成人综合久久精品免费| 在线jyzzjyzz免费视频| 毛片免费观看的视频在线| 久久天天躁狠狠躁夜夜免费观看| 四虎免费影院ww4164h| 久久国产免费观看精品3| 免费国产污网站在线观看15| 久久久99精品免费观看| 光棍天堂免费手机观看在线观看| 国产一级黄片儿免费看| 久久精品成人免费观看97| 久久不见久久见免费影院www日本 久久WWW免费人成—看片 | 无码欧精品亚洲日韩一区| 久久久久亚洲Av片无码v| 亚洲A∨无码一区二区三区| 久久亚洲精品成人777大小说| 亚洲国产老鸭窝一区二区三区 | 国产精品亚洲专区在线播放|