oracle游标(Oracle中如何查看游标信息)
一、oracle用游标分页查询学生所有信息
Oracle内分页:
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游标是什么请用自己话描述,谢谢大家了。
一游标是什么
游标字面理解就是游动的光标。
用数据库语言来游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等。
二游标的分类
显式游标和隐式游标
显式游标的使用需要4步:
1.声明游标
CURSOR mycur(vartype number) is
select emp_no,emp_zc from cus_emp_basic
where com_no= vartype;
2.打开游标
open mycur(000627)
注:000627是参数
3.读取数据
fetch mycur into varno, varprice;
4.关闭游标
close mycur;
三游标的属性
oracle游标有4个属性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。
%ISOPEN判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false;
%FOUND%NOTFOUND判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false;
%ROWCOUNT返回当前位置为止游标读取的记录行数。
四示例
set serveroutput on;
declare
varno varchar2(20);
varprice varchar2(20);
CURSOR mycur(vartype number) is
select emp_no,emp_zc from cus_emp_basic
where com_no= vartype;
begin
if mycur%isopen= false then
open mycur(000627);
end if;
fetch mycur into varno,varprice;
while mycur%found
loop
dbms_output.put_line(varno||','||varprice);
if mycur%rowcount=2 then
exit;
end if;
fetch mycur into varno,varprice;
end loop;
close mycur;
end;
PL/SQL记录的结构和C语言中的结构体类似,是由一组数据项构成的逻辑单元。
PL/SQL记录并不保存在数据库中,它与变量一样,保存在内存空间中,在使用记录时候,要首先定义记录结构,然后声明记录变量。可以把PL/SQL记录看作是一个用户自定义的数据类型。
set serveroutput on;
declare
type person is record
(
empno cus_emp_basic.emp_no%type,
empzc cus_emp_basic.emp_zc%type);
person1 person;
cursor mycur(vartype number)is
select emp_no,emp_zc from cus_emp_basic
where com_no=vartype;
begin
if mycur%isopen= false then
open mycur(000627);
end if;
loop
fetch mycur into person1;
exit when mycur%notfound;
dbms_output.put_line('雇员编号:'||person1.empno||',地址:'||person1.empzc);
end loop;
close mycur;
end;
典型游标for循环
游标for循环示显示游标的一种快捷使用方式,它使用for循环依次读取结果集中的行数据,当form循环开始时,游标自动打开(不需要open),每循环一次系统自动读取游标当前行的数据(不需要fetch),当退出for循环时,游标被自动关闭(不需要使用close)。使用游标for循环的时候不能使用open语句,fetch语句和close语句,否则会产生错误。
set serveroutput on;
declare
cursor mycur(vartype number)is
select emp_no,emp_zc from cus_emp_basic
where com_no=vartype;
begin
for person in mycur(000627) loop
dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);
end loop;
end;
三、Oracle游标提取相关的数据的语法介绍
本文主要介绍的是Oracle游标提取相关的数据的实际操作方案首先我们要从Oracle游标中得到一行相关的数据我个人提议你使用FETCH命令当每一次提取数据后 Oracle游标都指向结果集的下一行语法如下
FETCH cursor_name INTO variable[ variable ]
对于SELECT定义的Oracle游标的每一列 FETCH变量列表都应该有一个变量与之相对应变量的类型也要相同
例
SET SERVERIUTPUT ON
DECLARE
v_ename EMP ENAME%TYPE;
v_salary EMP SALARY%TYPE;
CURSOR c_emp IS SELECT ename salary FROM emp;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename v_salary;
DBMS_OUTPUT PUT_LINE( Salary of Employee|| v_ename
|| is|| v_salary);
FETCH c_emp INTO v_ename v_salary;
DBMS_OUTPUT PUT_LINE( Salary of Employee|| v_ename
|| is|| v_salary);
FETCH c_emp INTO v_ename v_salary;
DBMS_OUTPUT PUT_LINE( Salary of Employee|| v_ename
|| is|| v_salary);
CLOSE c_emp;
END
这段代码无疑是非常麻烦的如果有多行返回结果可以使用循环并用Oracle游标属性为结束循环的条件以这种方式提取数据程序的可读性和简洁性都大为提高下面我们使用循环重新写上面的程序
SET SERVERIUTPUT ON
DECLARE
v_ename EMP ENAME%TYPE;
v_salary EMP SALARY%TYPE;
CURSOR c_emp IS SELECT ename salary FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_ename v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT PUT_LINE( Salary of Employee|| v_ename
|| is|| v_salary);
END
lishixinzhi/Article/program/Oracle/201311/18889