最近的工作感触,记录一下


首先就是发现自己对Jquery的理解还是皮毛啊,根本就没有发现它的精髓,一直都只是会用一些change、blur之类的事件+匿名函数的方式,但是上次遇到了动态添加元素并且绑定事件的情况下就没辙了,后来发现Jquery还有live这样的事件委派发方法。

当需要在页面上动态的添加元素,并且同时要给元素添加事件的时候,老的办法自然就是在HTML里面写上一大堆的onclik=、onchange=之类的,但是作为代码洁癖的我自然是不能这么写的,之前我采用的办法是把之前写的绑定事件再次绑定,但是这次我碰上了麻烦,因为我发现这样做了之后之前存在的同类元素的事件并没有消失,重复绑定之后造成了事件会重复执行。Live这样的事件委派方法就解决了这样的问题了。

先看看Live方法的定义:

.live() 方法能对一个还没有添加进DOM的元素有效,是由于使用了事件委托:绑定在祖先元素上的事件处理函数可以对在后代上触发的事件作出回应。传递给 .live() 的事件处理函数不会绑定在元素上,而是把他作为一个特殊的事件处理函数,绑定在 DOM 树的根节点上。在我们的例子中,当点击新的元素后,会依次发生下列步骤:


  1. 生成一个click事件传递给 <div> 来处理 
  2. 由于没有事件处理函数直接绑定在 <div> 上,所以事件冒泡到DOM树上
  3. 事件不断冒泡一直到DOM树的根节点,默认情况下上面绑定了这个特殊的事件处理函数。
  4. 执行由 .live() 绑定的特殊的 click 事件处理函数。
  5. 这个事件处理函数首先检测事件对象的 target 来确定是不是需要继续。这个测试是通过检测 $(event.target).closest('.clickme') 能否找到匹配的元素来实现的。
  6. 如果找到了匹配的元素,那么调用原始的事件处理函数。


由于只有在事件发生时才会在上面的第五步里做测试,因此在任何时候添加的元素都能够响应这个事件。

它的作用基本上和.bind() 的作用是完全一致的,只是似乎对部分事件的支持不足,但是在新版本中基本上也修正了。

$("p").live("click", function(){
    $(this).after("<p>It Works!</p>");
});


然后就是Oracle 9i之后的WITH子查询分解语句

这东西原本的作用是把SQL语句中需要反复执行的SQL子查询片段放到一个临时的表空间中,以期加快SQL语言的运行速度。但是我却利用它来实现其他的功效。

在此之前需要做一个统计,因为需要同时显示本期、同期和今年至今的三个数据对比和进度,所以用了Union ALL将这三部分的数据都做了数据并联然后分别设置了TimeTag加以区分,然后用Group BY Rollup和Grouping来做统计。

但是带来的一个问题就是——本来只需要输入一个当前年、当前月份(其实因为年份与月份是分开设置的,所以上个月的时间节点也是Java计算出的),但是在SQL中就需要输入5组这样的数据,这个项目又不允许使用存储过程,所以用Java的StringBuilder来串联这个长SQL每次都要切断,然后在好几千个字符中找到对应的项目来修改,太麻烦了。

于是With AS就闪亮登场的来解决这个问题了。把这几个变量的输入改为:

WITH THIS_YEAR AS (SELECT 2012 THISYEAR FROM DUAL),
  THIS_MONTH AS (SELECT 4 THISMONTH FROM DUAL)

然后在之后的SELECT语句中碰到对应的变量就改为:

WHERE O.YEAR = (SELECT THISYEAR FROM THIS_YEAR)

这样就相当于变相的把变量在程序的开头就赋值了,省去了在程序中去到处去找地方赋值的问题。

但是需要注意的是:


  1. WITH似乎只能放在语句的最前面。
  2. WITH只能有一个,AS可以有多个,每个用逗号分隔。
  3. 位于后面的AS可以直接使用前面AS定义出的临时表。
  4. 所有定义的临时表一定要使用,否则一定会报错,前面定义了之后在后面的AS里使用了也算用。
  5. WITH比直接使用变量慢,对速度要求很高的时候不要图这种方便
  6. 我的这种使用方法是邪道……



另外关于Oracle的闪回表的一点知识:

只要Oracle打开了闪回功能,我们是可以检索到所有的闪回的记录的,也可以藉此来恢复表的数据记录(如果做了不小心的DELECT操作有救了),不过flashback有容量限制,不能太指望它

它同时还能够做时间机器一样的功能,给定具体的时间点就能够把那个时候的操作结果重现出来。具体的方法如下:

首先检索一下系统现在存在的闪回记录节点:

SELECT SCN,TO_CHAR(TIME_DP,'yyyy-mm-dd hh24-mi:ss') FROM SYS.SMON_SCN_TIME ORDER BY 2;

我这里显示最早的记录是4月9日,也就是它也就保留了5天的记录(这个与各个地方的服务器设置与操作的频繁程度有关)

然后就可以用它来玩玩了,先把上面那句话的ORDER BY语句DESC一下,记录一下最近的一条SCN值

然后修改一个表(我用的是STU表,原本有一条记录),添加一条记录

然后对这个表做一下操作

ALTER TABLE STU ENABLE ROW MOVEMENT;

这句话是允许Oracle修改ROWID字段,方便等下用flashback来做回滚操作

这时候试试

SELECT * FROM stu

自然是得到了两条记录了,原本一条加上我刚才加入的一条。

然后测试一下:

SELECT * FROM stu AS OF SCN 19636666

意思是穿越到SCN为19636666的节点时间再做检索,现在就发现只剩之前的那一条记录了。

然后还可以根据时间点来回滚

FLASHBACK TABLE stu TO SCN 19636666

如果你提示了ORA-08189,记得运行那句ALTER

评论

此博客中的热门博文

远程记录OpenWRT日志

用OpenWRT打造自动翻墙路由器(详解篇)

转一下关于Fuck的用法