扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Oracle内分页:
创新互联建站从2013年成立,先为南澳等服务建站,南澳等地企业,进行企业商务咨询服务。为南澳企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
1.首先创建返回结果集的包,代码如下:
--创建包
create or replace package types as
type cursorType is ref cursor;
end;12341234
2.创建实现分页查询的存储过程:
--创建存储过程
CREATE OR REPLACE PROCEDURE PROC_GET_DATA_PAGING(P_TABLENAME IN VARCHAR2, --表(视图)名
P_STRWHERE IN VARCHAR2, --查询条件
P_ORDERCOLUMN IN VARCHAR2, --排序的列
P_CURPAGE IN OUT NUMBER, --当前页
P_PAGESIZE IN OUT NUMBER, --每页显示记录条数
P_TOTALRECORDS OUT NUMBER, --总记录数
P_TOTALPAGES OUT NUMBER, --总页数
V_CUR OUT TYPES.CURSORTYPE) --返回的结果集
IS
V_SQL VARCHAR2(4000) := ''; --SQL语句
V_STARTRECORD NUMBER(10); --开始显示的记录条数
V_ENDRECORD NUMBER(10); --结束显示的记录条数
V_SHOWALL INTEGER; --是否显示全部记录
BEGIN
--记录中总记录条数
V_SQL := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || P_TABLENAME ||
' WHERE 1=1 ';
IF P_STRWHERE IS NOT NULL OR P_STRWHERE '' THEN
V_SQL := V_SQL || P_STRWHERE;
END IF;
EXECUTE IMMEDIATE V_SQL
INTO P_TOTALRECORDS;
--验证页面记录大小
IF P_PAGESIZE = 0 THEN
V_SHOWALL := 1;
P_PAGESIZE := 0;
END IF;
IF V_SHOWALL IS NULL THEN
--根据页大小计算总页数
IF MOD(P_TOTALRECORDS, P_PAGESIZE) = 0 THEN
P_TOTALPAGES := TRUNC(P_TOTALRECORDS / P_PAGESIZE, 0);
ELSE
P_TOTALPAGES := TRUNC(P_TOTALRECORDS / P_PAGESIZE, 0) + 1;
END IF;
ELSE
P_TOTALPAGES := 1;
END IF;
--验证页号
IF P_CURPAGE 1 THEN
P_CURPAGE := 1;
END IF;
IF P_CURPAGE P_TOTALPAGES THEN
P_CURPAGE := P_TOTALPAGES;
END IF;
--实现分页查询
V_STARTRECORD := (P_CURPAGE - 1) * P_PAGESIZE + 1;
V_ENDRECORD := P_CURPAGE * P_PAGESIZE;
V_SQL := 'SELECT * FROM (SELECT A.*, ROWNUM R FROM ' ||
'(SELECT * FROM ' || P_TABLENAME;
IF P_STRWHERE IS NOT NULL OR P_STRWHERE '' THEN
V_SQL := V_SQL || ' WHERE 1=1 ' || P_STRWHERE;
END IF;
IF P_ORDERCOLUMN IS NOT NULL OR P_ORDERCOLUMN '' THEN
V_SQL := V_SQL || ' ORDER BY ' || P_ORDERCOLUMN;
END IF;
IF V_SHOWALL IS NULL THEN
V_SQL := V_SQL || ') A WHERE ROWNUM = ' || V_ENDRECORD ||
') B WHERE R = ' || V_STARTRECORD;
ELSE
V_SQL := V_SQL || ') A ) B ';
END IF;
DBMS_OUTPUT.PUT_LINE(V_SQL);
OPEN V_CUR FOR V_SQL;
END PROC_GET_DATA_PAGING;123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
一定要先创建返回结果集的包,否则编译存储过程有问题。
首先你定义一个直接游标,比如c,然后直接open c for select 你要的列 from 表a union all select 你要的列 from 表b union all select 你要的列 from 表c 等等(每个表名后可以有自己的where条件)。
也可以把union all 换成union 不同的是union all 直接合并数据集不去重复数据,union 会移除数据集间的重复数据,因为union 去重,所以性能不如union all,选择哪个自己考虑。
至于说游标影响性能,无稽之谈。所有的dml和dql语句都会声明一个游标,区别在于显式或者隐式。性能问题在于你sql的写法,不在是不是游标。
游标能够根据查询条件从数据表中提取一组记录,将其作为一个临时表置于数据缓冲区中,利用指针逐行对记录数据进行操作。
Oracle中的游标分为显示游标和隐式游标 。
在执行SQL语句时,Oracle会自动创建隐式游标,该游标是内存中处理该语句的数据缓冲区,存储了执行SQL语句的结果。通过隐式游标属性可获知SQL语句的执行状态信息。
%found:布尔型属性,如果sql语句至少影响到一行数据,值为true,否则为false。
%notfound:布尔型属性,与%found相反。
%rowcount:数字型属性,返回受sql影响的行数。
%isopen:布尔型属性,当游标已经打开时返回true,游标关闭时则为false。
用户可以显式定义游标。使用显式游标处理数据要4个步骤:定义游标、打开游标、提取游标数据和关闭游标。
游标由游标名称和游标对应的select结果集组成。定义游标应该放在pl/sql程序块的声明部分。
语法格式:cursor 游标名称(参数) is 查询语句
打开游标时,游标会将符合条件的记录送入数据缓冲区,并将指针指向第一条记录。
语法格式:open 游标名称(参数);
将游标中的当前行数据赋给指定的变量或记录变量。
语法格式:fetch 游标名称 into 变量名;
游标一旦使用完毕,就应将其关闭,释放与游标相关联的资源。
语法格式:close 游标名称;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
loop
fetch c1 into v_sno,v_cno,v_grade;
exit when c1%notfound;--紧跟fetch之后
if c1%found then
dbms_output.put_line(to_char(c1%rowcount)||v_cno);
end if;
end loop;
close c1;
end;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
fetch c1 into v_sno,v_cno,v_grade;
while c1%found loop
dbms_output.put_line(v_sno||v_cno||v_grade);
fetch c1 into v_sno,v_cno,v_grade;
end loop;
close c1;
end;
第三种:for
declare
cursor c1 is select sno,cno,grade from sc;
begin
for item in c1 loop
dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));
end loop;
end;
SELECT 字段1,字段2,・・・・・・,字段n INTO 变量1,变量2,・・・・・・,变量n FROM 表名;
这样写试一下,看看是否好用。
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
SQL show parameter open_cursors;
NAME TYPE VALUE
------------------------------------ ----------- -------------------
open_cursors integer 3002、查看当前打开的游标数目
SQL select count(*) from v$open_cursor;
COUNT(*)
----------174943、修改Oracle最大游标数
SQL alter system set open_cursors=1000 scope=both;
系统已更改。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流