Plone技术资料

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1681|回复: 0

Oracle 数据库排序及分页

[复制链接]
发表于 2018-10-30 09:47:02 | 显示全部楼层 |阅读模式
由于Oracle数据库不支持LIMIT/OFFSET,Oracle 数据库的分页只能通过子查询进行,如果还要排序,就要注意子查询的写法,以免影响性能.
本文以SQLalchemy + ox_Oracle + Oracle 11为例子,说明排序及分页.
  1.     def query(self,kwargs):
  2.         """以分页方式提取记录,参数:start 游标起始位置;size:每次返回的记录条数;
  3.         fields:field list
  4.         if size = 0,then不分页,返回所有记录集
  5.         order_by(text("id"))
  6.         --------------------------------
  7.         //page是当前页序数,rows是显示行数
  8.         int page=2;
  9.         int rows=5;                           
  10.         List<Articles> list=a.select(page*rows+1,(page-1)*rows);
  11.         //  sql语句:  
  12.         select * from(select a.*,rownum rn from (select * from t_articles) a where rownum < 11) where rn>5
  13.       //第一个参数,对应着第一个rownum<11,第二个参数对应着rn>5
  14.         --------------------------------        
  15.         """

  16.         start = int(kwargs['start'])
  17.         size = int(kwargs['size'])
  18. #         import pdb
  19. #         pdb.set_trace()
  20.         max = size + start + 1
  21.         keyword = kwargs['SearchableText']
  22.         import os
  23.         os.environ['NLS_LANG'] = '.AL32UTF8'        
  24.         direction = kwargs['sort_order'].strip()        

  25.         if size != 0:
  26.             if keyword == "":
  27.                 if direction == "reverse":
  28.                     selectcon = text("select * from"
  29.                                      "(select a.*,rownum rn from "
  30.                                      "(select * from admin_logs ORDER BY id DESC) a "
  31.                                      "where rownum < :max) where rn > :start")
  32.                     
  33. #                     selectcon = text("select * from admin_logs  ORDER BY id DESC")
  34.                 else:
  35.                     selectcon = text("select * from"
  36.                                      "(select a.*,rownum rn from "
  37.                                      "(select * from admin_logs ORDER BY id ASC) a "
  38.                                      "where rownum < :max) where rn > :start")                    
  39. #                     selectcon = text("select * from admin_logs  ORDER BY id ASC LIMIT :start,:size")

  40.                 recorders = session.query("adminid","userid","datetime",
  41.                                       "ip","type","operlevel","description","result").\
  42.                             from_statement(selectcon.params(start=start,max=max)).all()
  43.             else:
  44.                 if direction == "reverse":
  45.                     selectcon = text("select * from"
  46.                                 "(select a.*,rownum rn from "
  47.                                 "(select * from admin_logs where"
  48.                                  " description LIKE :x "
  49.                                   " OR userid LIKE :x"
  50.                                   " OR adminid LIKE :x"
  51.                                   " OR operlevel LIKE :x"
  52.                                   " OR result LIKE :x"
  53.                                   " OR ip LIKE :x"
  54.                                   " ORDER BY id DESC ) a "
  55.                                   "where rownum < :max) where rn > :start"
  56.                                   )
  57.                 else:
  58.                     selectcon = text("select * from"
  59.                                 "(select a.*,rownum rn from "
  60.                                 "(select * from admin_logs where"
  61.                                  " description LIKE :x "
  62.                                   " OR userid LIKE :x"
  63.                                   " OR adminid LIKE :x"
  64.                                   " OR operlevel LIKE :x"
  65.                                   " OR result LIKE :x"
  66.                                   " OR ip LIKE :x"
  67.                                   " ORDER BY id ASC ) a "
  68.                                   "where rownum < :max) where rn > :start"
  69.                                   )
  70.                 recorders = session.query("adminid","userid","datetime",
  71.                                       "ip","type","operlevel","description","result").\
  72.                                       from_statement(selectcon.params(x=keyword,start=start,max=max)).all()  
  73.                
  74.         else:
  75.             if keyword == "":
  76.                 selectcon = text("select * from admin_logs  order by id desc ")
  77.                 recorders = session.query("adminid","userid","datetime",
  78.                                       "ip","type","operlevel","description","result").\
  79.                             from_statement(selectcon).all()
  80.             else:
  81.                 selectcon = text("select * from admin_logs where"
  82.                                  " description LIKE :x "
  83.                                   " OR userid LIKE :x"
  84.                                   " OR adminid LIKE :x"
  85.                                   " OR operlevel LIKE :x"
  86.                                   " OR result LIKE :x"
  87.                                   " OR ip LIKE :x"
  88.                                   " order by id DESC ")

  89.                 recorders = session.query("adminid","userid","datetime",
  90.                                       "ip","type","operlevel","description","result").\
  91.                                       from_statement(selectcon.params(x=keyword)).all()  
  92.             
  93.             
  94.             nums = len(recorders)
  95.             return nums
  96.         try:
  97. #             session.commit()
  98.             return recorders
  99.         except:
  100.             session.rollback()
  101.             pass
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|Plone技术资料 ( 湘ICP备14006519号-1 )

GMT+8, 2019-11-19 00:49 , Processed in 0.046173 second(s), 18 queries , Gzip On.

Powered by Plone! X3.4

© 2001-2019 Plone.org.

快速回复 返回顶部 返回列表