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

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

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

    冷面閻羅

    低調(diào)做人&&高調(diào)做事
    隨筆 - 208, 文章 - 3, 評論 - 593, 引用 - 0
    數(shù)據(jù)加載中……

    多重子查詢提取每次子查詢的SQL語句

            之前用的oracle大型數(shù)據(jù)庫,寫的sql都是依據(jù)oracle的。移動(dòng)端部分用的不能是oracle數(shù)據(jù)庫,只能采用小型數(shù)據(jù)庫,現(xiàn)場采用db2。
            db2大小只能論k為單位,很多基本的sql語法都不支持,尤其多重子查詢就不支持,做試驗(yàn)報(bào)告的閥值就必須得用這個(gè)子查詢,沒有部分只好將多重子查詢提出sql,單獨(dú)執(zhí)行。
            提取多重子查詢的方法倒是不復(fù)雜,就是對sql語句循環(huán)處理,判斷是否含有多個(gè)select關(guān)鍵字,如果有從字符串最后一個(gè)select處理,截取sql語句,執(zhí)行,然后將查詢的結(jié)果替換原先的sql語句,直到循環(huán)判斷sql語句中只有一個(gè)select關(guān)鍵字。
             關(guān)鍵部分的代碼:
            int lastSelectNo = 0;
            
    int size = 0;
            
            
    if (sqlString.split("select").length - 1 > 0)
                size 
    = sqlString.split("select").length - 1;
            
    else if (sqlString.split("SELECT").length - 1 > 0)
                size 
    = sqlString.split("SELECT").length - 1;

            String[] sql 
    = new String[size];

            
    while (isHaveTwoSelect(sqlString))
            
    {
                lastSelectNo 
    = sqlString.lastIndexOf("select");
                
    if (lastSelectNo == 0)
                    lastSelectNo 
    = sqlString.lastIndexOf("SELECT");

                
    char beforeLast = sqlString.charAt(lastSelectNo - 1);
                
    if (beforeLast == '(')
                
    {
                    
    int k = 5;
                    String string 
    = sqlString.substring(lastSelectNo).substring(0, k);
                    
    while (!IsMatching(string))
                    
    {
                        k
    ++;
                        string 
    = sqlString.substring(lastSelectNo).substring(0, k);
                    }

                    sql[size 
    - 1= string.substring(0, k - 1);
                    sqlString 
    = replace(sqlString, sql[size - 1].toString(), "sql[" + (size - 1+ "]");
                    size
    --;
                }
    //if(befor            
            }

            sql[
    0= sqlString;

          問題是:對于select關(guān)鍵字的處理,目前只知道全是小寫select或是全是大寫SELECT,實(shí)際中select關(guān)鍵字這個(gè)不考慮大小寫限制,我這邊還尚未進(jìn)行校驗(yàn),一是比較麻煩二是尚未發(fā)現(xiàn)好的方法,目前就是對select關(guān)鍵字依次判斷是否是s e l e c t幾個(gè)字符 ,不考慮大小寫。
         大家如果有好的處理select關(guān)鍵字方法,歡迎得道你的支持。

    posted on 2008-04-22 20:58 冷面閻羅 閱讀(2101) 評論(2)  編輯  收藏 所屬分類: java

    評論

    # re: 多重子查詢提取每次子查詢的SQL語句  回復(fù)  更多評論   

    上午又對核心算法優(yōu)化一下,可以處理多個(gè)并列的SQL。具體算法如下:
    while (isHaveTwoSelect(sqlString)) 

    lastSelectNo 
    = sqlString.lastIndexOf("select"); 
    if (lastSelectNo == 0
    lastSelectNo 
    = sqlString.lastIndexOf("SELECT"); 

    int k = 5
    String string 
    = sqlString.substring(lastSelectNo).substring(0, k); 
    while (!IsMatching(string)) 

    k
    ++
    string 
    = sqlString.substring(lastSelectNo).substring(0, k); 
    }
     
    sql[size 
    - 1= string.substring(0, k - 1); 
    sqlString 
    = sqlString.substring(0, lastSelectNo) + "sql[" + (size - 1+ "]" + sqlString.substring(lastSelectNo + k - 1, sqlString.length()); 
    size
    --
    }
     
    sql[
    0= sqlString; 
    2008-04-23 12:40 | 冷面閻羅

    # re: 多重子查詢提取每次子查詢的SQL語句  回復(fù)  更多評論   

    盡量不要在循環(huán)里寫sql語句,很容易造成不良危險(xiǎn)
    2008-04-25 14:44 | 懶人
    主站蜘蛛池模板: 人妻无码一区二区三区免费 | 亚洲国产综合AV在线观看| 亚洲中文字幕AV每天更新| 巨波霸乳在线永久免费视频| 色吊丝最新永久免费观看网站 | eeuss在线兵区免费观看| 亚洲?V无码成人精品区日韩| 国产97视频人人做人人爱免费| 亚洲精品色婷婷在线影院 | 亚洲欧美aⅴ在线资源| 搡女人免费免费视频观看| 亚洲国产美女精品久久久久∴| 一道本不卡免费视频| 岛国av无码免费无禁网站| 亚洲欧洲无码一区二区三区| 成年午夜视频免费观看视频 | 国产一级淫片a免费播放口之| 看一级毛片免费观看视频| 亚洲一区二区精品视频| 国产成人无码区免费内射一片色欲| 亚洲国产精品嫩草影院在线观看| 亚洲精华国产精华精华液好用| 国产又大又粗又硬又长免费| 亚洲一区二区电影| 一区二区免费在线观看| 亚洲精品夜夜夜妓女网| 久久精品国产免费观看 | 亚洲人JIZZ日本人| 啦啦啦完整版免费视频在线观看 | 日韩免费在线中文字幕| 人人狠狠综合久久亚洲88| 日韩在线免费视频| 免费观看四虎精品成人| 亚洲国产香蕉碰碰人人| 免费视频淫片aa毛片| 久久久久免费视频| 亚洲免费闲人蜜桃| 亚洲精品亚洲人成在线观看下载| 国产白丝无码免费视频| 国产A在亚洲线播放| 成人激情免费视频|