Oracle語句自動判斷是要更新記錄還是要插入記錄

最近有一個需求,要做站內的關鍵詞搜索。關鍵詞要保存到Oracle的表,如果表裏沒有該記錄就新增,如果有記錄就將搜索次數加1。雖然看似簡單,可寫SQL時卻不知從何下手。找了一下,原來是這樣寫法的。記錄一下。

MERGE INTO KEYWORD T1
                                       USING (SELECT :NAME AS NAME,:PIN_YIN AS PIN_YIN,:PIN_YIN_FIRST AS PIN_YIN_FIRST,1 As TIMES FROM dual) T2
                                       ON (T1.NAME=T2.NAME)
                                       WHEN MATCHED THEN
                                            UPDATE SET T1.TIMES = T1.TIMES + 1
                                       WHEN NOT MATCHED THEN
                                            INSERT(NAME,PIN_YIN,PIN_YIN_FIRST,TIMES) VALUES(T2.NAME,T2.PIN_YIN,T2.PIN_YIN_FIRST,T2.TIMES)

 

另外站內的搜索關鍵詞高亮腳本如下

//定義的配置
Keyword = {
    //如果配置,則只搜索ID爲此的元素,否則搜索整個BODY
    elementid: 'content',
    //是否匹配整個單詞
    exact: false,
    //最大的搜索節點,避免文檔過大時的假死
    max_nodes: 1000,
    //是否在加載時調用
    onload: true,
    //樣式的名稱
    style_name: 'keyword',
    //樣式是否有後綴,true則可以使不同的關鍵詞有不同的顏色
    style_name_suffix: true,
    //前一跳轉頁的地址,此參數只用於調試時
    debug_referrer: '',
    //用於指定固定要做高亮處理的關鍵詞
    light_key: '',
    //用於指定固定要做鏈接處理的關鍵詞
    link_key: ''
};


// 網頁處理的主函數
Keyword.main = function(strTask_type) {
    // If 'debug_referrer' then we will use that as our referrer string
    // instead.
    // q是網頁從何跳轉來的URL地址,也可以自己定。q要做解碼處理
    // e是網頁的內容或者是指定元素的內容
    // lightkey是要加亮的關鍵字列表
    // linkkey是要做鏈接的關鍵字列表
   
    task_type = strTask_type;
    var q = Keyword.debug_referrer ? Keyword.debug_referrer : document.referrer;
    var e = document.getElementById(Keyword.elementid) ? document.getElementById(Keyword.elementid) : document.body;
    q = decodeURIComponent(q);
    //高度處理
    var lightkey = Keyword.GetLightKeyList(q);
    if (lightkey && e)
    {
     Keyword.lightElement(e, lightkey);
    }
    //鏈接處理
    var linkkey = Keyword.GetLinkKeyList(q);
    if (linkkey && e)
    {
     Keyword.linkElement(e, linkkey,strTask_type);
    }
   
};

// 返回要加亮的關鍵字列表
Keyword.GetLightKeyList = function(referrer) {
    var query = null;
    if (referrer.match(/^.*key=([^&]+)&?.*$/i)){
        query = RegExp.$1;
    }
    query = query + " " + Keyword.light_key;
    if (query){
        query = query.replace(//'|"/g, '');
        query = query.split(/[/s,/(,/),/|,-,/+/.]+/);
    }
    return query;
};

//返回要加鏈接的關鍵字列表
Keyword.GetLinkKeyList = function(referrer) {
    //此處從網頁控件得到固定要做鏈接處理的關鍵詞
    try
    {
       Keyword.link_key = document.form1.txb_CommonKeyWord.value;
    }
    catch(err)
    {
    }
    var query = null;
    if (referrer.match(/^.*link=([^&]+)&?.*$/i)){
        query = RegExp.$1;
    }
    query = query + " " + Keyword.link_key;
    if (query){
        query = query.replace(//'|"/g, '');
        query = query.split(/[/s,/(,/),/|,-,/+/.]+/);
    }
    return query;
};


// 設置高亮
Keyword.lightElement = function(elm, lightkey) {
    if (!lightkey || elm.childNodes.length == 0)
 return;

    var qreLight = new Array();
    for (var i = 0; i < lightkey.length; i ++) {
        lightkey[i] = lightkey[i].toLowerCase();
        if (Keyword.exact)
            qreLight.push('//b'+lightkey[i]+'//b');
        else
            qreLight.push(lightkey[i]);
    }
    qreLight = new RegExp(qreLight.join("|"), "i");
    var stylemapper = {};
    for (var i = 0; i < lightkey.length; i ++) {
        if (Keyword.style_name_suffix)
            stylemapper[lightkey[i]] = Keyword.style_name+(i % 5);
        else
            stylemapper[lightkey[i]] = Keyword.style_name+0;
    }
   
    var textproc = function(node) {
        var match = qreLight.exec(node.data);
        if (match) {
            var val = match[0];
            var k = '';
            var node2 = node.splitText(match.index);
            var node3 = node2.splitText(val.length);
            var span = node.ownerDocument.createElement('SPAN');
            node.parentNode.replaceChild(span, node2);
            span.className = stylemapper[val.toLowerCase()];
            span.appendChild(node2);
            return span;
        }
        else{
            return node;
        }
    };
    Keyword.walkElements(elm.childNodes[0], 1, textproc);
};

// 設置鏈接
Keyword.linkElement = function(elm, linkkey) {
    if (!linkkey || elm.childNodes.length == 0)
 return;

    var qreLink = new Array();
    for (var i = 0; i < linkkey.length; i ++) {
        linkkey[i] = linkkey[i].toLowerCase();
        if (Keyword.exact)
            qreLink.push('//b'+linkkey[i]+'//b');
        else
            qreLink.push(linkkey[i]);
    }
    qreLink = new RegExp(qreLink.join("|"), "i");


    var textproc = function(node) {
        var match = qreLink.exec(node.data);
        if (match) {
            var val = match[0];
            var k = '';
            var node2 = node.splitText(match.index);
            var node3 = node2.splitText(val.length);
            var link = node.ownerDocument.createElement('A');
            node.parentNode.replaceChild(link, node2);
            link.href = "FullTextSearch.aspx?searchtype=txt&key=" + val;
            link.title = "搜索“" + val + "”";
            link.target="_blank";
            link.appendChild(node2);
            return link;
        }
        else{
            return node;
        }
    };
    Keyword.walkElements(elm.childNodes[0], 1, textproc);
};


//用於對網頁元素的遍歷
Keyword.walkElements = function(node, depth, textproc) {
    var skipre = /^(script|style|textarea)/i;
    var count = 0;
    while (node && depth > 0) {
        count ++;
        if (count >= Keyword.max_nodes) {
            var handler = function() {
                Keyword.walkElements(node, depth, textproc);
            };
            setTimeout(handler, 50);
            return;
        }

        if (node.nodeType == 1) { // ELEMENT_NODE
            if (!skipre.test(node.tagName) && node.childNodes.length > 0) {
                node = node.childNodes[0];
                depth ++;
                continue;
            }
        } else if (node.nodeType == 3) { // TEXT_NODE
            node = textproc(node);
        }

        if (node.nextSibling) {
            node = node.nextSibling;
        } else {
            while (depth > 0) {
                node = node.parentNode;
                depth --;
                if (node.nextSibling) {
                    node = node.nextSibling;
                    break;
                }
            }
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章