游标的主要作用是把select的数据,存到游标里,然后用的时候在读出来。
一般的步骤是:
1.定义游标:如 CURSOR c_student IS SELECT sname FROM student ORDER BY sname; 意思是建立了一个叫c_student的游标,它里面装的是SELECT sname FROM student的一条条记录,是根据ORDER BY sname来排列的
tips:cursor c_student is select sname || age from student 在fetch c_studnet into nameandage 这样读取的是sname和age合在一起的信息。当然这一步也完全可以在游标读取到内容再进行拼凑。只是说也它的可行性
2.打开游标:用open c_student来打开游标。%isopen c_student 来判断是否已经打开游标了
3.提取游标里的参数:用fetch来提取游标里值。先在declare里面写好一个参数,用来装cursor c_student.然后就用 fetch c_student into rec_stu装进去了。接着你用输出函数 DBMS_OUTPUT.PUT_LINE(REC_STU);就可以输出第一条信息了。当然你多加几句
fetch c_student into rec_stu;
DBMS_OUTPUT.PUT_LINE(REC_STU);这块代码,游标就一条一条帮你继续写出来。
4.然后用完了把游标 关掉吧 是个好习惯啊!
create or replace procedure c_su is
CURSOR c_student IS SELECT sname FROM student ORDER BY sname;
rec_stu student.sname%TYPE
begin
open c_student;
fetch c_student into rec_stu;
DBMS_OUTPUT.PUT_LINE(REC_STU);
close c_student;
end c_su;
二 使用循环输出游标。
意思差不多,就是在读游标的时候,使用了一个循环。
首先介绍一下循环:
这次不用fetch来装游标里的值了,咱用for来装:for s_name in c_student,装好之后就用loop循环吧.
for s_name in c_student
loop
DBMS_OUTPUT.put_line(s_name.sname);
end loop;
当然也可以这样来遍历:
loop
fetch c_studnet into rec_stu;
DBMS_OUTPUT.put_line(rec_stu);
end loop;
两者的区别就是:
假如你定义的游标是 cursor1 is select * from student。
for s_value in cursor1 那么可以用s_name.xxx的形式,取出任何一个列的值。
而如果用fetch 。。into。。读取出多列,那么只能是这样写fetch cursor1 into col1,col2,col3。。
tip:注意一下顺序for s_name in c_student <> fetch c_student into rec_stu;别下手太快搞错了。
三 游标属性:游标属性
%isopen 布尔型,如果游标打开,则为true
%notfound 布尔型,如果没有返回行,则为true
%found 布尔型,如果有返回行,则为true
%rowcount 数值型,当前为止从工作返回的总行数
根据这些属性我们可以给cursor再遍历的时候,加点判断,以求完美
loop
fetch c_studnet into rec_stu;
flag := c_student%isopen;
DBMS_OUTPUT.put_line(rec_stu);
countrow := c_studnet%rowcount;
DBMS_OUTPUT.put_line(countrow);--每次执行打印一次所执行的行数
exit when c_student%notfound;--如果没有返回行,退出
end loop;
DBMS_OUTPUT.put_line(flag);--判断游标打开否,true果,false未果
DBMS_OUTPUT.put_line(countrow);--执行打印所有执行的行数
四 隐式游标:
所有隐式的游标都叫SQL,是oracle自带的游标。简单的说你拿来用就是了。用的时候只要根据属性来判断,判断之后写你要操作的statement就可以了。写个例子:
create or replace procedure testsqlcursor(
v_id in testemp.empno%TYPE
) is
begin
delete from testemp where empno = v_id;
if sql%notfound then
delete from salary where ID = v_id;
END IF;
DBMS_OUTPUT.put_line(sql%rowcount);
end testsqlcursor;
五 游标变量。我觉得游标变量要比直接定义一个显示游标要灵活,
有些书上说是 动态游标,显示和隐式的叫静态游标。
1.游标声明:
声明成有返回值的叫强类型定义,没有返回值的叫弱类型定义( 大概这意思)
游标变量的声明分成两步:
1.1 游标的声明 TYPE cursor1_type is ref cursor;
1.2 游标的定义 cur1 cursor1_type;
例子:声明一个强的,一个弱的
create or replace procedure TEST_REF_CURSOR
is
type return_type is record(
v_name testemp.empno%type,
v_job testemp.job%type
);
type cur1_type is ref cursor return return_type;
type cur3_type is ref cursor return testemp%rowtype;
type cur2_type is ref cursor;
cur1 cur1_type;--用cur1_type定义了一个cursor
cur2 cur2_type;--同上
cur3 cur3_type;--同上
begin
commit;
end TEST_REF_CURSOR;
2.打开游标 OPEN emp_refcur FOR
SELECT employees.employee_id, employees.first_name||employees.last_name, employees.job_id
3.遍历游标
还是老方法 fetch cursor_name into variable_name
然后就loop吧loop完别忘了end loop就行,建议写完loop就直接写end loop。
4.关闭游标
养成物归原主的好习惯,用完了,你得关了它。
5.例子
还是写个例子吧
create or replace procedure TEST_REF_CURSOR is
type return_type is record(
v_name testemp.empno%type,
v_job testemp.job%type);
type cur3_type is ref cursor return testemp%rowtype;
cur3 cur3_type;
rec testemp%rowtype;
begin
open cur3 for
select * from testemp order by testemp.empno;
loop
fetch cur3 into rec;
exit when cur3%notfound;
dbms_output.put_line(rec.ename||rec.job);
end loop;
close cur3; --如果你要用游标对其他表进行处理的话,你只要再次打开游标就是了,当然你定义得是弱类型的游标,顺便把记录变量定义--一下就可以使用了。
end TEST_REF_CURSOR;
给个例子弱类型游标变量:
create or replace procedure TEST_REF_CURSOR is
type return_type is record(
v_name testemp.empno%type,
v_job testemp.job%type);
type cur3_type is ref cursor return testemp%rowtype;
type cur2_type is ref cursor;
cur2 cur2_type;
cur3 cur3_type;
rec testemp%rowtype;
rec2 salary%rowtype;
begin
open cur3 for
select * from testemp order by testemp.empno;
loop
fetch cur3
into rec;
exit when cur3%notfound;
-- dbms_output.put_line(rec.ename||rec.job);
end loop;
close cur3;
open cur2 for
select * from testemp order by testemp.empno;
loop
fetch cur2
into rec;
exit when cur2%notfound;
dbms_output.put_line(rec.deptno || rec.empno || rec.ename || rec.job);
end loop;
close cur2;
open cur2 for
select * from salary where salary.id = 3 order by salary.id;
loop
fetch cur2
into rec2;
exit when cur2%notfound;
dbms_output.put_line(rec2.sal);
end loop;
close cur2;
end TEST_REF_CURSOR;
一些补充:
TYPE MYTYPE (
MYTYPE1 NUMBER,
MYTYPE2 VARCHAR2,
MYTYPE3 VARCHAR
);
这样就算是定义了一个类型
然后声明一个为之对应的类型比如
mytype_1 MYTYPE;
那MYTYPE_1就可以用这个MYTYPE类型了
TABLENAME.COLNAME%TYPE
declare
myparameter test.name%type; --是说明你用test表里name列的类型
TABLENAME%ROWTYPE
DECLARE
REC TEST%ROWTYP;--说明rec的类型和test表里各个列的类型是一样的。
分享到:
相关推荐
隐式游标是Oracle自动管理的,每次执行DML语句(INSERT、UPDATE、DELETE)时都会使用。而显式游标则需要我们手动声明和管理,适用于更复杂的逻辑处理。 1. 隐式游标: 隐式游标在Oracle中默认开启,无需显式声明。...
Oracle 一次请求执行多条sql语句 在.net 中查询Sql Server 一次请求执行多条sql语句很简单 拼接起来就好了 ...还有一种就是很简单的拼接字符串的方法 语法略微和sql server有些区别 适合新手学习
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,对于新手来说,掌握其基本操作和概念是学习的第一步。这个“适合新手的Oracle练习题集合”旨在帮助初学者巩固理论知识,提高实践技能,同时通过解决实际问题...
6. **高级SQL功能**:可能包含集合运算符(UNION、INTERSECT和EXCEPT)、窗口函数(ROW_NUMBER、RANK和DENSE_RANK等)、游标和存储过程的使用。 7. **索引和性能优化**:介绍如何创建和管理索引,以及如何通过索引...
Oracle9i基础资料整理是一份综合性的学习资源,涵盖了Oracle数据库的基础知识、日常维护、游标的使用、LDAP(轻量级目录访问协议)配置以及Oracle与SAP的对比分析。以下是对这些知识点的详细说明: 1. **Oracle基础...
Oracle数据库是全球广泛使用的大型...掌握这些概念后,新手可以逐步深入学习Oracle的更多高级特性,如触发器、函数、包以及数据库设计和管理等。在实际工作中,灵活运用这些工具将极大地提升数据库管理的效率和质量。
"Oracle专家高级编程.pdf":这本书可能专注于更高级的Oracle编程技巧,如PL/SQL的使用,复杂查询的编写,游标,异常处理,数据库链接,以及大规模数据处理和并发控制策略。这些内容对于已经掌握基础的开发者来说,是...
本主题主要关注"Oracle和跨页选择",这涉及到数据库查询中的分页操作,对于新手来说是理解和掌握数据库使用的重要一环。 在Oracle中,进行数据查询时,我们经常需要对结果集进行分页展示,以方便用户逐页浏览大量...
总的来说,"Oracle数据库中文手册"是一本全面的参考资料,无论你是Oracle新手还是经验丰富的DBA,都能从中找到你需要的知识。通过深入学习和实践,可以提升你在Oracle数据库管理和应用上的专业能力。
本教程由任老师精心编撰,涵盖了Oracle的基本使用方法以及高级PL/SQL编程技巧,包括存储过程和游标等关键概念。 首先,Oracle是一个关系型数据库管理系统(RDBMS),在企业级数据管理和分析中广泛应用。它提供了...
这些资料全面覆盖了Oracle数据库的基础知识、进阶技能以及特定领域的应用,无论是对刚接触Oracle的新手,还是寻求提升技能的资深DBA,都能从中获益匪浅。通过系统学习,你可以掌握Oracle数据库的设计、管理和维护,...
以下是一些Oracle新手入门的知识点: 1. **安装与配置**: 首先,你需要下载并安装Oracle数据库软件,如Oracle Database Express Edition (XE) 或其他版本。安装过程中会涉及到环境变量设置、监听配置和数据库实例...
Oracle技术手册是数据库管理员、开发人员以及对Oracle数据库系统感兴趣的 IT 专业人士的重要参考资料。...无论是新手还是经验丰富的DBA,这份资源都将为你的Oracle知识体系添砖加瓦,助你在IT领域取得成功。
总而言之,Oracle编程入门经典是一本全面介绍Oracle数据库基础知识和编程实践的教程,无论你是初次接触Oracle的新手还是希望巩固基础的开发者,都能从中受益匪浅。通过学习和实践,你将能够熟练地在Oracle环境中编写...
1. **Oracle+PLSQL+语法手册.chm**:这是一部关于Oracle的PL/SQL编程语言的手册,涵盖了PL/SQL的基础语法、控制结构、异常处理、游标、存储过程和函数等核心概念。PL/SQL是Oracle数据库的内置过程语言,用于编写...
以下是一些Oracle入门的重要知识点: 1. **用户管理**:在Oracle中,`USER`是数据库的一个关键概念,用于区分不同的数据库用户。你可以通过`SELECT USER FROM DUAL;`来查看当前登录的用户。`ALTER USER`命令用于...
### Oracle PL/SQL 语言袖珍参考...综上所述,《Oracle PL/SQL 语言袖珍参考手册》(第五版)是一本针对Oracle PL/SQL语言开发者的必备参考书,无论是对于新手还是经验丰富的开发者而言,都能从中获得有价值的信息。
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,对于新手来说,了解其基本的SQL语法和操作是入门的关键。本文将详细解析Oracle中的数据定义语言(DDL)和一些基础概念。 首先,我们来看创建表的语句。在...
11. **游标**:学习游标的使用,提高数据处理效率。 12. **存储过程与函数**:了解如何编写PL/SQL代码实现更复杂的数据处理逻辑。 #### 四、作者和技术贡献者 文档中列出了多位作者和技术贡献者的名字,他们是: - ...
本教程针对初学者,旨在提供全面而深入的Oracle基础知识,帮助新手快速掌握这一强大的数据库系统。 1. 数据库概述:Oracle数据库是Oracle公司开发的、基于SQL标准的关系型数据库系统。它提供了数据存储、管理、查询...