快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

oracle游标怎么查询,oracle游标查询吃内存么?

oracle用游标分页查询学生所有信息

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

一定要先创建返回结果集的包,否则编译存储过程有问题。

Oracle数据库中如何用显式游标查询位于不同表的数据

首先你定义一个直接游标,比如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 游标

游标能够根据查询条件从数据表中提取一组记录,将其作为一个临时表置于数据缓冲区中,利用指针逐行对记录数据进行操作。

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;

如何获取oracle游标变量的数据

SELECT 字段1,字段2,・・・・・・,字段n INTO 变量1,变量2,・・・・・・,变量n FROM 表名;

这样写试一下,看看是否好用。

如何用Oracle查看与修改最大游标数

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;

系统已更改。


网站标题:oracle游标怎么查询,oracle游标查询吃内存么?
转载来源:http://6mz.cn/article/hcseco.html

其他资讯