教育房产时事环球科技商业
投稿投诉
商业财经
热点动态
科技数码
软件应用
国际环球
晨报科学
新闻时事
信息智能
汽车房产
办公手机
教育体育
生活生物

oracle分页(一文看懂Oracle分页实现方案的三种方式)

  oracle分页(一文看懂Oracle分页实现方案的三种方式)Oracle分页实现
  闲来无事,整理下Oracle、mysql、mssql以及PG数据库的分页实现方式,大家可以简单做个对比,看下不同数据库在分页这块是怎么实现的。今天先介绍一下Oracle分页的实现方式。
  oracle的分页一共有三种方式,但在Oracle中实现分页的方法主要是用ROWNUM关键字和用ROWID关键字两种。Rownum 和 Rowid是Oracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录。1、根据rowid来分
  Oracle使用rowid数据类型存储行地址,rowid是物理存在的,实际存在的一个列,是一种数据类型。 基于64为编码的18个字符来唯一标识的一条记录的物理位置的一个ID。而唯一标识出对应的存储的物理位置, 类似hashcode值。
  rowid可以分成两种,分别适于不同的对象:1)Physicalrowids:存储ordinarytable,clusteredtable,tablepartitionandsubpartition,indexe,indexpartitionandsubpartition2)Logicalrowids:存储IOT的行地址
  另一种rowid类型叫universal rowed(UROWID),支持上述physical rowid和logical rowed,并且支持非oracle table, 即支持所有类型的rowid, 但COMPATIBLE必须在8.1或以上.
  每个表在oracle内部都有一个ROWID伪列,它在所有sql中无法显示,不占存储空间; 它用于从表中查询行的地址或者在where中进行参照,rowid伪列不存储在数据库中,它不是数据库数据,这是从database及table的逻辑结构来说的,事实上,在物理结构上,每行由一个或多个row pieces组成,每个row piece的头部包含了这个piece的address,即rowid.从这个意义上来说,rowid还是占了磁盘空间的。
  我们在创建表时,可以为列指定为rowid数据类型,但oracle并不保证列中的数据是合法的rowid值,必须由应用程序来保证, 另外,类型为rowid的列需要6 bytes存储数据
  一般实现分页的过程如下:
  1)获取数据物理地址:SELECT ROWID RID, tablenumber FROM table_name ORDER BY tablenumber DESC
  2)取得最大页数:SELECT ROWNUM RN, RID FROM (SELECT ROWID RID, tablenumber FROM table_name ORDER BY tablenumber DESC) WHERE ROWNUM <= xx
  3)取得最小页数:SELECT RID FROM(SELECT ROWNUM RN, RID FROM (SELECT ROWID RID, tablenumber FROM table_name ORDER BY tablenumber DESC) WHERE ROWNUM <= xx)
  4)因为取得的页数都是物理地址,再根据物理地址,查询出具体数据--currentPage:当前页数--pageSize:每页显示几条SELECT*FROMtable_nameWHEREROWIDIN  (SELECTRIDFROM(SELECTROWNUMRN,RIDFROM(SELECTROWIDRID,tablenumberFROMtable_nameORDERBYtablenumberDESC)WHEREROWNUM<=((currentPage-1)*pageSize+pageSize))  WHERERN>((currentPage-1)*pageSize))  ORDERBYtablenumberDESC;
  2、按分析函数 ROW_NUMBER() OVER()来分
  语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
  oracle中的ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)
  一般实现分页的过程如下:--currentPage:当前页数--pageSize:每页显示几条SELECT*FROM(SELECTT.*,ROW_NUMBER()OVER(ORDERBYtablenumberDESC)RKFROMtT)WHERERK<=((currentPage-1)*pageSize+pageSize)  ANDRK>((currentPage-1)*pageSize);
  3、根据rownum 来分
  rownum是伪列,是在获取查询结果集后再加上去的 (获取一条记录加一个rownum)。对符合条件的结果添加一个从1开始的序列号
  对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
  一般实现分页的过程如下:--currentPage:当前页数--pageSize:每页显示几条SELECT*FROM(SELECTT.*,ROWNUMRNFROM(SELECT*FROMtORDERBYtablenumberDESC)TWHEREROWNUM<=((currentPage-1)*pageSize+pageSize))WHERERN>((currentPage-1)*pageSize);
  4、存储过程实现
  这个存储过程主要是让大家看看分页的实现过程,可忽略--1、开发一个包,在该包中,定义类型test_cursor,是个游标createorreplacepackagetestpackageastypetest_cursorisrefcursor;endtestpackage;--2、开始编写分页的过程createorreplaceprocedurefenye(tableNameinvarchar2,--表名  pageSizeinnumber,--一页显示记录数  pageNowinnumber,--当前页  myrowsoutnumber,--总记录数  myPageCountoutnumber,--总页数  p_cursorouttestpackage.test_cursor--返回的记录集  )is--定义部分  --定义sql语句字符串  v_sqlvarchar2(1000);--定义两个整数  v_beginnumber:=(pageNow-1)*pageSize+1;  v_endnumber:=pageNow*pageSize;  begin--执行部份  v_sql:='select*from(selectt1.*,rownumrnfrom(select*from'||  tableName||')t1whererownum<='||v_end||')wherern>='||  v_begin;--把游标和sql关联  openp_cursorforv_sql;--计算myrows和myPageCount  --组织一个sql  v_sql:='selectcount(*)from'||tableName;--执行sql,并把返回的值赋给myrows;  executeimmediatev_sql  intomyrows;--计算myPageCount  ifmod(myrows,PageSize)=0then  myPageCount:=myrows/PageSize;else  myPageCount:=myrows/PageSize+1;endif;--关闭游标  closep_cursor;end;
  5、实例演示
  5.1、环境准备createtablet(EMPNONUMBER(4)notnull,  ENAMEVARCHAR2(10),  JOBVARCHAR2(9),  MGRNUMBER(4),  HIREDATEDATE,  SALNUMBER(7,2),  COMMNUMBER(7,2),  DEPTNONUMBER(2));altertabletaddconstraintPK_EMPprimarykey(EMPNO)usingindex;INSERTINTOtVALUES('7369','SMITH','CLERK','7902',TO_DATE('1980-12-1700:00:00','SYYYY-MM-DDHH24:MI:SS'),'800',NULL,'20');INSERTINTOtVALUES('7499','ALLEN','SALESMAN','7698',TO_DATE('1981-02-2000:00:00','SYYYY-MM-DDHH24:MI:SS'),'1600','300','30');INSERTINTOtVALUES('7521','WARD','SALESMAN','7698',TO_DATE('1981-02-2200:00:00','SYYYY-MM-DDHH24:MI:SS'),'1250','500','30');INSERTINTOtVALUES('7566','JONES','MANAGER','7839',TO_DATE('1981-04-0200:00:00','SYYYY-MM-DDHH24:MI:SS'),'2975',NULL,'20');INSERTINTOtVALUES('7654','MARTIN','SALESMAN','7698',TO_DATE('1981-09-2800:00:00','SYYYY-MM-DDHH24:MI:SS'),'1250','1400','30');INSERTINTOtVALUES('7698','BLAKE','MANAGER','7839',TO_DATE('1981-05-0100:00:00','SYYYY-MM-DDHH24:MI:SS'),'2850',NULL,'30');INSERTINTOtVALUES('7782','CLARK','MANAGER','7839',TO_DATE('1981-06-0900:00:00','SYYYY-MM-DDHH24:MI:SS'),'2450',NULL,'10');INSERTINTOtVALUES('7788','SCOTT','ANALYST','7566',TO_DATE('1987-04-1900:00:00','SYYYY-MM-DDHH24:MI:SS'),'3000',NULL,'20');INSERTINTOtVALUES('7839','KING','PRESIDENT',NULL,TO_DATE('1981-11-1700:00:00','SYYYY-MM-DDHH24:MI:SS'),'5000',NULL,'10');INSERTINTOtVALUES('7844','TURNER','SALESMAN','7698',TO_DATE('1981-09-0800:00:00','SYYYY-MM-DDHH24:MI:SS'),'1500','0','30');INSERTINTOtVALUES('7876','ADAMS','CLERK','7788',TO_DATE('1987-05-2300:00:00','SYYYY-MM-DDHH24:MI:SS'),'1100',NULL,'20');INSERTINTOtVALUES('7900','JAMES','CLERK','7698',TO_DATE('1981-12-0300:00:00','SYYYY-MM-DDHH24:MI:SS'),'950',NULL,'30');INSERTINTOtVALUES('7902','FORD','ANALYST','7566',TO_DATE('1981-12-0300:00:00','SYYYY-MM-DDHH24:MI:SS'),'3000',NULL,'20');INSERTINTOtVALUES('7934','MILLER','CLERK','7782',TO_DATE('1982-01-2300:00:00','SYYYY-MM-DDHH24:MI:SS'),'1300',NULL,'10');commit;
  5.2、根据rowid查询--查询当前第一页,并显示5行数据(currentPage=1,pagesize=5)SELECT*FROMtWHEREROWIDIN  (SELECTRIDFROM(SELECTROWNUMRN,RIDFROM(SELECTROWIDRID,EMPNOFROMtORDERBYEMPNODESC)WHEREROWNUM<=((1-1)*5+5))--每页显示几条  WHERERN>((1-1)*5))--当前页数  ORDERBYEMPNODESC;  --查询当前第二页,并显示6行数据(currentPage=2,pagesize=6)SELECT*FROMtWHEREROWIDIN  (SELECTRIDFROM(SELECTROWNUMRN,RIDFROM(SELECTROWIDRID,EMPNOFROMtORDERBYEMPNODESC)WHEREROWNUM<=((2-1)*6+6))--每页显示几条  WHERERN>((2-1)*6))--当前页数  ORDERBYEMPNODESC;
  5.3、根据分页函数查询--查询当前第一页,并显示6行数据(currentPage=1,pagesize=6)SELECT*FROM(SELECTT.*,ROW_NUMBER()OVER(ORDERBYtablenumberDESC)RKFROMtT)WHERERK<=((1-1)*5+5)--每页显示几条  ANDRK>((1-1)*5);--当前页数
  5.4、根据分页函数查询--查询当前第二页,并显示4行数据(currentPage=2,pagesize=4)SELECT*FROM(SELECTT.*,ROWNUMRNFROM(SELECT*FROMtORDERBYempnoDESC)TWHEREROWNUM<=((2-1)*4+4))WHERERN>((2-1)*4);
  觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

蕃茄牛肉(那一碗令人神往的西红柿浓汤牛肉)蕃茄牛肉(那一碗令人神往的西红柿浓汤牛肉)曾经和闺密踏寻过贵州的美食,被他们的酸汤牛肉,酸汤鸡酸汤鱼深深地吸引着。深深的爱着那美食,只是因为家里忌口吃辣的。所以只能改变下策略。恰巧龙虎山悬棺(江西龙虎山悬棺之谜)龙虎山悬棺(江西龙虎山悬棺之谜)在中国都讲究入土为安,中国的丧葬形式有很多种,土葬火葬水葬冻葬崖葬船棺葬等等。而就在江西龙虎山上,就有一个崖葬尤为出名。江西龙虎山是中国道教的发源地龙虎山悬棺(江西龙虎山悬棺之谜)龙虎山悬棺(江西龙虎山悬棺之谜)中国人大都讲究一个入土为安,但是随着悠悠历史的演变,各种丧葬方式渐渐涌现出来火葬水葬船棺葬崖葬这当中崖葬的方式固然令人匪夷所思,但其实在古代,除了江牛奶配送员的奇幻人生(塞尔维亚高分奇幻剧情片)牛奶配送员的奇幻人生(塞尔维亚高分奇幻剧情片)牛奶配送员的奇幻人生是塞尔维亚(前南斯拉夫)导演埃米尔库斯图里卡自编自导自演的奇幻剧情片,主要演员还有莫妮卡贝鲁奇莫妮卡贝鲁奇等,此片漂流瓶的故事(美国女子捡到95年前漂流瓶)漂流瓶的故事(美国女子捡到95年前漂流瓶)据CNN6月23日报道,一名船长在清理其扬基阳光号的船底时,发现了一个老式的绿色漂流瓶,在展开瓶中的纸条后,她惊讶地发现,这张纸条的日期是詹姆斯辛格尔顿(CBA外援传辛格尔顿)詹姆斯辛格尔顿(CBA外援传辛格尔顿)这是一个既幸运又悲情的外援,詹姆斯辛格尔顿1981年出生于美国芝加哥在NBA效力于小牛队奇才队,辛格尔顿有着劲爆的身体素质,终结能力突出,20恒大女排(恒大女排外援冠全场?)恒大女排(恒大女排外援冠全场?)2020东京奥运会2020东京奥运会女排预赛在有明体育馆战至A组第3轮,世联赛亚军巴西女排直落三局以30送日本第二败,这是继30轻取韩国32闯关多米量子霍尔效应(一文读懂神奇的量子反常霍尔效应)量子霍尔效应(一文读懂神奇的量子反常霍尔效应)出品科普中国制作大阪大学张昊监制中国科学院计算机网络信息中心2018年度国家科技奖励大会于2019年1月8日在北京举行,中国科学院院士大暑节气(大暑节气介绍)大暑节气(大暑节气介绍)大暑是二十四节气之一,北半球在每年7月2224日之间,南半球在每年1月2021日之间,太阳位于黄经120。大暑期间,汉族民间有饮伏茶,晒伏姜,烧伏香等习俗。白露诗句(关于白露节气的诗句)白露诗句(关于白露节气的诗句)见字第547期这些你都知道吗01hr令行今夜起,露白渐成霜。暑热炎炎褪,朝寒晚更凉。02hr昼热夜寒凉,听言水土将。盈余珠集结,化露白为霜。03hr玉描写雨的古诗(8首最美的春雨诗词)描写雨的古诗(8首最美的春雨诗词)伴随着和煦的春风,雨水来了。春雨,像一个可爱的小姑娘,带来春天的消息春雨,像一个温柔的母亲,滋润着世间万物。古人说遇雨则吉,春雨,无声地滋养人的心
1克拉是多少克(1克拉的钻戒有多大?)1克拉是多少克(1克拉的钻戒有多大?)人们在逛各种珠宝店的时候,会发现市场上有很多种大小不一款式迥异的钻戒,这些钻戒也会有不同的价格标签。那么,在这些众多的钻戒中,1克拉的钻戒有多jdk环境变量(java环境变量配置步骤有哪些?)jdk环境变量(java环境变量配置步骤有哪些?)现在很多自学java的同学不知道java环境变量配置步骤有哪些?那么java环境变量配置步骤有哪些呢?以下是我的回答,希望能帮助到补肾固元膏(固元膏,你知道吗?)补肾固元膏(固元膏,你知道吗?)固元膏,据传是慈禧晚年非常喜欢的一道药膳固元膏配方取自于李时珍本草纲目。固元膏基本的配方如下阿胶250g黑芝麻200g核桃仁200g冰糖150g黄酒怎样下载网上视频(如何在网页上直接下载各平台视频)怎样下载网上视频(如何在网页上直接下载各平台视频)一安装IDM插件首先进入IDM官网httpwww。internetdownloadmanager。com点击TryInternet新媒体运营(新媒体运营小白学习流程)新媒体运营(新媒体运营小白学习流程)网上千篇一律的都是新媒体运营小白教程,却没有告诉我们小白该怎么学习,从那开始学,学习的流程是什么,还有如何制定自己的学习计划。下面3个步骤,大致tplink无线路由器设置(TPLINK无线路由器怎么设置)tplink无线路由器设置(TPLINK无线路由器怎么设置)1看看路由器后面的接口。电源口连接电源用,LAN口可连接电脑,交换机,AP等。WAN口是连接外网用的,例如接宽带猫。2反如何进入路由器设置界面(TPlink路由器的设置)如何进入路由器设置界面(TPlink路由器的设置)一些朋友需要安装路由器买回来插上不能联网,或者想更改一下路由器密码,但是不知道再怎么操作。今天教大家如何设置路由器。首先进入路由器防火墙在哪里设置(Win7系统怎么设置防火墙?)防火墙在哪里设置(Win7系统怎么设置防火墙?)Win7系统怎么设置防火墙?电脑的防火墙能帮助电脑防御外来的病毒攻击,那么该如何设置一个防火墙呢?下面就给大家介绍电脑设置防火墙的具艾滋病感染几率(艾滋病的感染途径有哪些?)艾滋病感染几率(艾滋病的感染途径有哪些?)2020年我国的艾滋病新发病例约6。22万,2020年艾滋病死亡人数为1。9万。艾滋病是目前医疗界的一个难题。按照目前的医疗技术,艾滋病无艾滋病后院(朋友感染了艾滋病)艾滋病后院(朋友感染了艾滋病)如果你的朋友感染了艾滋病,你会怎么做?也许你会不知所措,也许会离开他,也许可能你没想过这个问题,因为你觉得艾滋病离我们太远有这么一句话相信你很早就听过胸肌怎么练(6个胸肌技巧,让你提高胸肌维度)胸肌怎么练(6个胸肌技巧,让你提高胸肌维度)原创内容,擅自搬运者必究!饱满的胸肌,是每个健身男士的追求。好看的胸肌线条,会让你不知不觉散发着荷尔蒙的魅力。但是,很多人练胸的时候发现