grouping : 用于确定统计结果是否用到了特定列。如果返回0,则表示统计结果使用了该列;如果返回1,则表示统计结果未使用该列

 SQL> SELECT name,address ,SUM(money),GROUPING(name),GROUPING(address) FROM customer GROUP BY CUBE(name,address);
 NAME                         ADDRESS  COUNT(*) SUM(MONEY) GROUPING(name)  GROUPING(address)
 ---------------------------- ------- ---------- --------- --------------  -----------------
                                         4		162.26		1				1
                             a		 	1		32			1				0
                             abcdefg		2		118.03		1				0
                             152号大街	1		12.23		1				0
 oxcow									2		118.03		0				1
 oxcow						abcdefg		2		118.03		0				0
 leeyee									2		44.23		0				1
 leeyee						a			1		32			0				0
 leeyee						152号大街	1		12.23		0				0
  • dense_rank(expr1,expr2,..) within group (order by expr1,expr2,..) : 该函数用于返回特定数据在一组行数据中的等级。关于rank,dense_rank的具体说明请查看

     SQL> select dense_rank(5000) within group (order by sal) rank from emp;
             RANK
             -----
             12
    
  • first : Oracle9i新增函数,获取首个排序等级,然后使用分组汇总函数汇总。该函数不能单独使用,必须与其他分组函数结合使用

     -- 年龄最大的一组人中工资最高的
     SQL> select max(money) keep (dense_rank first order by age desc) from customer;
    
  • 阅读全文......

  • 提交事务

     commit
    

    当执行commit后,会确认事务变化、结束事务、删除保存点、释放锁。以下情况会自动提交事务:

    • 执行DDL语句时;比如create table,alter table,drop table
    • 执行DCL语句时;比如grant,revoke等。
    • 退出SQL*Plus时。
  • 保存点

     savepoint <point_name>
     exec dbms_transaction.savepoint('<point_name>');
    

    阅读全文......

  • 数据查询语句(select 语句):用于检索数据库数据

  • 数据操纵语言(Data Manipulation Language,DML):用于改变数据库数据,包括insertupdatedelete三条语句

  • 事物控制语句(Transaction Contorl Language,TCL):用户维护数据库的一致性,包括commitrollbacksavepoint三条语句。

    阅读全文......

  • 在遍历数组时应将数组的长度保存在一个变量中,不要在循环中每次都访问数组长度。

    // bad code  
    for ( var i = 0; i < aArray.length; i++) {  
        // TODO something  
    }  
    
    // better code  
    var iLen = aArray.length;  
    for ( var i = 0; i < iLen; i++) {  
        // TODO something  
    }  
    

    2.如果需要给DOM中添加新的元素,避免创建一个元素添加一次。应尽量只添加一次

    // bad code  
    $.each(aArray, function(i, item) {  
        var newListItem = '<li>' + item + '</li>';  
        $('ul').append(newListItem); // 这里每append一次都将会重载DOM  
    });  
    
    // better code  
    var frag = document.createDocumentFragment(); // 创建文档碎片  
    $.each(aArray, function(i, item) {  
        var newListItem = '<li>' + item + '</li>';  
        frag.appendChild(newListItem); // 这里不会刷新DOM  
    });  
    $('ul').appendChild(frag); // 添加新元素,此时重载DOM一次  
    
    // or do this  
    var sHtml = '';  
    $.each(aArray, function(i, item) {  
        html += '<li>' + item + '</li>'; // 构造需要添加元素的字符串  
    });  
    $('ul').html(sHtml); // 使用jQuery的$.fn.html()方法添加改字符串  
    

    3.避免重复,保持代码干燥

    // bad code  
    if ($eventfade.data('currently') != 'showing') {  
        $eventfade.stop();  
    }  
    if ($eventhover.data('currently') != 'showing') {  
        $eventhover.stop();  
    }  
    if ($spans.data('currently') != 'showing') {  
        $spans.stop();  
    }  
    
    // good  
    var $elems = [ $eventfade, $eventhover, $spans ]; // 构造一个数组  
    $.each($elems, function(i, elem) {  
        if (elem.data('currently') != 'showing') {  
            elem.stop();  
        }  
    });  
    

    4.当心匿名函数。

    绑定匿名函数是让人头疼的,对于他们调试,修改,测试或者重用都是困难的。因此可以使用对象去组织和命名你的处理方法和回调函数

    // bad code  
    $(document).ready(function() {  
        $('#magic').click(function(e){  
                $('#yayeffects').slideUp(function() {  
                        // TODO some codes  
                });  
        });  
        $("#happiness").load(url + ' #unicorns',function(){  
            // TODO some codes  
        });  
    });  
      
    // better  
    var PI = {  
         onReady :  function(){  
                $('#magci').click(PI.candyMtn);  
                $('#happiness').load(PI.url + ' #unicorns', PI.unicornCb);  
         },  
         candyMtn : function(e) {  
                $('#yayeffects').slideUp(PI.slideCb);  
         },  
         slideCb : function() { // TODO some codes},  
         unicornCb : function() { // TODO some codes}  
    };  
    $(document).ready(PI.onReady);  
    

    5.选择器的优化

    5.1.通过ID来获取元素是最好的选择

    // fast  
    $('#container div.robotarm'); // 获取元素id=container中div元素class=robotarm的元素
    
    // super-fast  
    $('#container').find('div.robotarm');  
    

    $.fn.find方法是快速的,因为对于第一个选择$('#container')其实质是通过document.getElementById()来实现的。document.getElementById()是浏览器原生方法

    5.2.选择器的右边要具体化,而不是左边。

    阅读全文......

    原文地址:http://www.javascripttoolbox.com/bestpractices/

    1.总是使用关键字_var_声明变量

    javascript中的变量不是全局范围就是函数范围,使用关键字var声明变量是必不可少的。当声明一个变量时不管是全局变量还是函数级变量,都不应省略变量的前缀关键字var。下边的例子说明了如果不这样做可能存在的潜在问题。

    没有使用关键字var声明变量产生的问题

    var i = 0; // This is good - creates a global variable
    function test() {
        for (i=0; i<10; i++) {
            alert("Hello World!");
        }
    }
    test();
    alert(i); // The global variable i is now 10!
    

    阅读全文......

    在说明s:iterator标签的使用前,先了解下struts2中的Value Stack。这里参考了webwork中对Value Stack的描述,由于struts2是在webwork的基础上进行升级的,因此webwork对于Value Stack的表述同样适用于struts2。在这里不描述Value Stack具体做什么,但有两点需要注意:

    1. 一个value stack本质上是一个List;
    2. 在栈中调用 [n] 将返回一个从位置n开始的子栈;

    对于2举个例子说明。假定Value Stack包含了[model,action,others],那么

    1. [0] — 返回 [model,action,others];
    2. [1] — 返回 [action,others];
    3. [2] — 返回 [others];

    现在将开始介绍 s:iterator 的一些使用。以下代码片段均在开发环境eclipse3.4 wtp、tomcat5.5、jdk5上使用struts2.1.6测试通过。

    集合元素访问

    阅读全文......

    在实际的开发过程中遇到当调用javascript中window.close()方法时,IE会在页面关闭前询问用户是否要关闭的二次确认对话框。为了避免这个问题,需要在调用window对象的close方法前做一些处理

    针对IE的不同版本,处理方式是不同的。因此在处理之前应先判断IE浏览器的版本。

    浏览器及其版本的判断可以使用jQuery1.9版本之前的$.browser方法或者使用javascript检测浏览器版本中提到的方式检测,这里不在赘述直接给出相关代码。

    IE7及其以上版本

    if(isMinIE7||isMinIE8){ // IE7以上  
        window.open('','_top');  
        window.top.close();  
        return ;  
    }  
    

    IE6及其以下版本

    if(isMinIE6){//IE6   
        window.opener=null;  
        window.close();  
        return ;  
    }  
    

    Chrome,Safari和Firefox

     window.close(); 
    

    Notes:

    针对FireFox浏览器时,除了使用window.close(),为了达到直接关节而无需提示的效果都需要在FireFox的地址栏中输入about:config,然后将dom.allow_script_to_close_windows改为true才能达到想要的效果。

    阅读全文......

    以下浏览器版本的判断方法参考了《JavaScript 高级程序设计》第八章。

    总体上我们验证浏览器及其版本是通过浏览器的user-agent字符串来检测的。常见的有:

    Safari: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
    Chrome: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
    IE: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    Firefox:Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0

    阅读全文......