感觉他们的思维逻辑不正常 。
毛病1:
选择表中人员名字非空的所有人
在微软的mssqlserver中以下两句
select * from person_name where person_name <>'';
select * from person_name where person_name is not null;
在自然语言的语意上是一样的。执行结果也都正常。
但在oracle中。
select * from person_name where person_name <>'';
结果竟是一条记录也没有,也没有报错。
一定要写成
select * from person_name where person_name is not null;
但是选出所有人名不是'小王'的人时。用如下语句
select * from person_name where person_name <>'小王'';
Oracle的结果又是对的。
毛病2:
这个毛病在实际开发中碰上的。超难找。害我郁闷了半天,而且现在也没有分析出为什么。我想没有多少人敢说自己十分的清楚Oracle的RowNum是在什么时候,怎么一步步排出来的。。
先说一下原理
Oracle分页原理。
//有兴趣的可以google <<Hibernate分页查询原理解读>>一文
public String getLimitString(String sql) {
StringBuffer pagingSelect = new StringBuffer(100);
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
pagingSelect.append(sql);
pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
return pagingSelect.toString();
}
Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最快的方式
其中入参sql 可以为任意的SQL语句。
在实际用时我在250多个分页列表页里用都是正常的。但是就是有一个页面。真是怪。翻几页。就会出现最后一条不会更新的情况。:(
当时那条语句是这样的。
string sel_sql="SELECT ORGANIZE.ID, ORGANIZE.TITLE,ORGANIZE_TYPE.NAME TypeName FROM ORGANIZE, ORGANIZE_TYPE WHERE ORGANIZE_TYPE.ORGTYPE_ID = ORGANIZE.ORGTYPE_ID and ORGANIZE_TYPE.sts='A' and ORGANIZE.OFFICE_ID=128 order by TypeName ";
TzhPager1.SelectCommand=sel_sql;
TzhPager1.CurrentPageIndex = 0;
TzhPager1.DataBind();
查不出原因。看了半天。逻辑上没有地方不对呀。
最后我把“order by TypeName“ 改成了“order by TypeName Desc “ TMD显示又正常了。Oracle真是有病。
还不如去用个不要钱的mysql也比它好用。:(至少人家还有limit(m,n)直接拿来用。
Oracle这东东胖的猪一样。装一下硬盘用起来就是以G算。内存占用真是霸道。用起来思维逻辑又老让人想不通。装在windows平台上又没有半点优势。这种东西还不如不用的好。