现在的位置: 首页 > 综合 > 正文

怀疑做Oracle的人思维方式是不是有点秀逗

2012年09月19日 ⁄ 综合 ⁄ 共 1471字 ⁄ 字号 评论关闭

感觉他们的思维逻辑不正常

毛病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平台上又没有半点优势。这种东西还不如不用的好。

抱歉!评论已关闭.