oracle 存储过程的基本语法

1.基本结构

2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:

3.IF 判断

4.while 循环

5.变量赋值

6.用for in 使用cursor

7.带参数的cursor

8.用pl/sql developer debug
  连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

 

关于oracle存储过程的若干问题备忘

1.在oracle中,数据表别名不能加as,如:

也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧

2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。

3.在利用select…into…语法时,必须先确保数据库中有该条记录,否则会报出”no data found”异常。

可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select…into…

4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

5.在存储过程中,关于出现null的问题

假设有一个表A,定义如下:

如果在存储过程中,使用如下语句:

如果A表中不存在bid=”xxxxxx”的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:

这样就一切ok了。

6.Hibernate调用oracle存储过程

 

转自:http://www.cnblogs.com/happyday56/archive/2007/07/05/806830.html

Java反射执行方法时候捕获InvocationTargetException异常

公司项目中使用了Java的反射,通过反射执行别人的方法时候抛出了一个“java.lang.reflect.InvocationTargetException”的异常,百度了一下看的云里雾里的。

查看Java手册的解释是:InvocationTargetException 是一种包装由调用方法或构造方法所抛出异常的经过检查的异常。依然是很难理解。

因为涉及到跨组调试等问题,只能继续Google。最终还是在stackoverflow看到一个比较靠谱的解释“From the Javadoc of Method.invoke()
Throws: InvocationTargetException – if the underlying method throws an exception.
This exception is throw if the method called threw an exception.

”,应该是因为反射执行的方法里抛出了异常造成的。

 

转自:http://www.au92.com/archives/java-reflect-method-catch-InvocationTargetException.html

异步回调(伪Ajax方式)

一般情况下,使用Get、Post方式的Ajax我们都能够解决目前问题,只是应用复杂程度,当然,在开发中我们也许会碰到无法使用Ajax的时候,但是我们又需要模拟Ajax的效果,那么就可以使用伪Ajax的方式来实现我们的需求。

伪Ajax大致原理就是说我们还是普通的表单提交,或者别的什么的,但是我们却是把提交的值目标是一个浮动框架,这样页面就不刷新了,但是呢,我们又需要看到我们的执行结果,当然可以使用JavaScript来模拟提示信息,但是,这不是真实的,所以我们就需要我们的执行结果来异步回调,告诉我们执行结果是怎么样的。

假设我们的需求是需要上传一张图片,并且,需要知道图片上传后的状态,比如,是否上传成功、文件格式是否正确、文件大小是否正确等等。那么我们就需要我们的目标窗口把执行结果返回来给我们的窗口,这样就能够顺利的模拟一次Ajax调用的过程。

以下代码稍微多一点, 并且涉及Smarty模板技术,如果不太了解,请阅读相关技术资料。
上传文件:upload.html

处理上传的PHP文件:upload.php

模板文件:upload.tpl

 

使用异步回调的方式过程有点复杂,但是基本实现了Ajax、以及信息提示的功能,如果接受模板的信息提示比较多,那么还可以通过设置层的方式来处理,这个随机应变吧。

转自:http://blog.csdn.net/lne818/article/details/888244

让UNION与ORDER BY并存于SQL语句当中

在SQL语句中,UNION关键字多用来将并列的多组查询结果(表)合并成一个结果(表),简单实例如下

上面的代码可以实现将从Product1和Product2两张表合并成一个表,如果您只是希望合并两张表中符合特定条件的记录抑或是合并两张表各自的前N条记录,那么您的代码可能会像下面这样写:

This is so easy!但是假如您希望从包含Type字段的某表中根据Type分别随机筛选N条记录并将结果合并成一张表,您可能会像下面这样写:

在查询分析器中执行如上语句会报错,这个问题起初会令您觉得UNION在这方面似乎有点软弱,难道UNION和ORDER BY就不能共存吗?当然可以,下面的代码或许能实现与上面代码希望实现的相同功能:

代码看起来有些繁琐,或许针对这个问题有更见简洁明快的方法,我在这里也只是抛砖引玉,希望各位大侠能相处更为经典的代码,待续~

 

转自:http://www.cnblogs.com/yinzhenzhixin/archive/2009/01/07/1371064.html

关于获取表单数据

今天有个同事做二次开发的时候遇到一些表单数据的小问题,可是这些小问题却也难倒我了。因为之前一直在用struts处理表单数据,好久没直接处理过了。所以完全忘记了,温故知新一下。

获取JSP表单数据,通常的方法是request.getParameter。此方法对于POST提交方式来说,用来获得客户端传送给服务器请求中的消息体信息,对于GET来说是获取URL后面的参数值。无论哪一种方式,参数都是一样的,只是一个显示在消息体中,另外一个在URL上。该参数是由name指定的。

之前一直有个误区,以为request.getParameter只能获取URL上面的参数,正正忽略了还可以拿消息体里面的东西。因为一直以来都用FormBean的关系吧。这些都不大理会了。

如果request.getParameter获取不了值的话,原因会有三个。
1.获取的request.getParameter的参数值不存在于表单中。即没有一个标签里面的name是跟获取的参数所对应的。注意是name而不是id。
2.form表单设置了enctype=”multipart/form-data”属性。这个需要上传文件的时候会用到。
3.获取的参数标签里面存在disabled=”disabled”

对于第二种情况,想要获取参数值比较麻烦。因为表单数据都封装成meta二进制格式传输了。好像可以通过common-fileupload组件来解决。具体没测试,搜下应该有的。或者有更多其他办法解决。

中文问题:
表单提交的时候,数据流默认为ISO-8859-1。所以获取的值的时候,中文的话可能会出现乱码情况,这时候只用通过转码就可以了。

另外说一下 request.getAttribute

这个方法通常服务器端使用setAttribute,用来封装bean放回给视图层进行进一步的操作。此时视图层就使用getAttribute进行获取数据了。另外setAttribute方式不一定是request,参照scope吧。可选访问更广阔。

关于如何选择GET还是POST


URL的长度

   URL是有长度限制的,一般不超过255bytes..实际不同的浏览器会有不同长度准则。
所以表单提交的时候选择method时还必须考虑数据量的问题。大数据和不想数据显示在URL上的话,选择POST比较好。

浏览器缓存机制

GET方法的时候需要注意URL缓存机制,因为浏览器为提供性能,如果通过GET方法投递的两次URL都相同的话,第二次会启动缓存机制。所以常常需要通过传送一个虚拟的值来区分,为了避免第二次获取了一次缓存值。

而对于POST,因为消息体浏览器并不知道它内容,不能判断是否两次投递的信息是否一样。所以不会启动缓存机制。

 安全性

对于POST和GET两种请求方式,POST方法也相对的安全那么一点。

 

总结一点,在普通情况下,能用POST就用POST吧。但是GET方法又可以在很多的情况下给与我们带来很多的便利,也是不可缺少的。

 

转自:http://blog.csdn.net/kennylee26/article/details/3076625

数据采集Jsoup

这段时间想自己做个东西,但内容自然没有,得抓。
一开始,我使用PHP在写抓取的,结果发现,自己写正则表达式来抓取真的很痛苦,一级一级太恶心了。
问问google,他告诉我,Jsoup 吧,这东西可以以JQuery的语法来做(JQuery?没错,就是JQuery)

下面,让我来演示一下用Jsoup怎么抓取 http://www.soku.com/search_video/q_mv 上的列表中的各项 MV 的信息吧。So Easy(HttpClient + Jsoup)

下面代码很长,但主要是在定义 YoukuMv 这个类,这个类代表列表中的每一个Mv,而且,这代码都是NetBeans自动生成的。

代码性能优异,在NetBeans里直接运行,小于1秒(包括初始化程序、通过网络请求HTML内容)可以把这个页面采集、解析完(毕竟Java性能摆在那儿)所有的解析过程(从HTML到解析出一个个的 YoukuMv 对象)耗时在 230ms 到 235 ms 之间

补充: 其实PHP的实现 phpQuery 在这个上面性能也不赖,同样的功能,400ms就可以解析完成了。

另外,下面这代码实在30分钟以内一气呵成写完了(包括找采集目标到最终编写完成),除了在采集播放次数哪儿第一次没有替换掉 , 导致一次异常外,其它的都是一次通过(说明绝对够简单了吧)。





 

转自:http://hi.baidu.com/zhangsilly/item/0f04a2dfa02b45fcca0c39d9

JS中批量给元素绑定事件过程中的相关问题使用闭包解决

解决元素批量绑定事件的时候,出现i=最后一个循环变量的值的方法有两种:把这个循环变量保存起来,不要让它的作用域在整个函数,而是在循环体内
在JS中,你写一个for循环的时候,内部的循环变量I其实是会保存在它运行的函数或类内的,所以你会发现你给元素批量绑定事件的时候,出现i=最后一个循环变量的值,这就很坑爹啊,解决的方案有2钟,
思路就是:把这个循环变量保存起来,不要让它的作用域在整个函数,而是在循环体内

1.使用闭包(如果你不懂闭包,请打开百度:www.baidu.com)
2.使用with关键字,with语法是with( obj ) { //使得可以在此直接访问obj的属性,而不用加obj.XXX }
代码示例:


 

转自:http://www.jb51.net/article/35581.htm

ibatis解决sql注入问题

对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转义交给了数据库,不会出现注入问题;如果采用$写法,则相当于拼接字符串,会出现注入问题。

例如,如果属性值为“’ or ‘1’=’1 ”,采用#写法没有问题,采用$写法就会有问题。

对于like语句,难免要使用$写法,

1. 对于Oracle可以通过’%’||’#param#’||’%’避免;

2. 对于MySQL可以通过CONCAT(‘%’,#param#,’%’)避免;

3. MSSQL中通过‘%’+#param#+’% 。

如下3种SQL语句:

 

转自:http://blog.csdn.net/scorpio3k/article/details/7610973

js小技巧: 给div绑定keydown事件

要想给一个元素绑定keydown事件我们经常这样: 

但是当你尝试给div元素绑定时会发现不起作用, 解决办法是给这个div添加一个tabindex的属性: 

 

转自:http://www.douban.com/group/topic/28694305/

c:forEach 的常用整理

获取<c:forEach的长度: var cnt = parseInt(‘${fn:length(images)}’);

<c:forEach>标签具有以下一些属性:

var:迭代参数的名称。在迭代体中可以使用的变量的名称,用来表示每一个迭代变量。类型为String。

items:要进行迭代的集合。对于它所支持的类型将在下面进行讲解。

varStatus:迭代变量的名称,用来表示迭代的状态,可以访问到迭代自身的信息。

begin:如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。

end:如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。它的类型也为整数。

step:迭代的步长。

current:当前这次迭代的(集合中的)项。

index:当前这次迭代从0开始的迭代索引。

count:当前这次迭代从1开始的迭代计数。

first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。

last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。

begin:begin属性的值。

end:end属性的值

step:step属性的值

<c:if test=”${status.count%2==0}”></c:if>//被2整除

<c:if test=”${status.first==true}”></c:if>//是第一个元素

<c:if test=”${status.last==true}”></c:if>//是最后一个元素

 <c:forEach begin=”1″ end=”5″ var=”i” items=”${list}”></c:forEach>

转自:http://www.cnblogs.com/jirglt/archive/2013/01/24/2874799.html