`
chenpenghui
  • 浏览: 39278 次
  • 性别: Icon_minigender_1
  • 来自: 台州
社区版块
存档分类
最新评论

新手 ORACLE游标的一些使用

阅读更多

 

 

游标的主要作用是把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 游标+SQL 游标 小例子+帮助文档

    隐式游标是Oracle自动管理的,每次执行DML语句(INSERT、UPDATE、DELETE)时都会使用。而显式游标则需要我们手动声明和管理,适用于更复杂的逻辑处理。 1. 隐式游标: 隐式游标在Oracle中默认开启,无需显式声明。...

    .Net Oracle一次请求执行多条sql语句 Oracle批处理 使用游标一次执行多条Sql语句

    Oracle 一次请求执行多条sql语句 在.net 中查询Sql Server 一次请求执行多条sql语句很简单 拼接起来就好了 ...还有一种就是很简单的拼接字符串的方法 语法略微和sql server有些区别 适合新手学习

    适合新手的oracle练习题集合

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,对于新手来说,掌握其基本操作和概念是学习的第一步。这个“适合新手的Oracle练习题集合”旨在帮助初学者巩固理论知识,提高实践技能,同时通过解决实际问题...

    从实践中学习Oracle SQL(非常适合新手学习Oracle数据库的书籍,全是实例)

    6. **高级SQL功能**:可能包含集合运算符(UNION、INTERSECT和EXCEPT)、窗口函数(ROW_NUMBER、RANK和DENSE_RANK等)、游标和存储过程的使用。 7. **索引和性能优化**:介绍如何创建和管理索引,以及如何通过索引...

    Oracle9i基础资料整理

    Oracle9i基础资料整理是一份综合性的学习资源,涵盖了Oracle数据库的基础知识、日常维护、游标的使用、LDAP(轻量级目录访问协议)配置以及Oracle与SAP的对比分析。以下是对这些知识点的详细说明: 1. **Oracle基础...

    oracle 适合新手的基本用法

    Oracle数据库是全球广泛使用的大型...掌握这些概念后,新手可以逐步深入学习Oracle的更多高级特性,如触发器、函数、包以及数据库设计和管理等。在实际工作中,灵活运用这些工具将极大地提升数据库管理的效率和质量。

    Oracle和跨页选择(新手)

    本主题主要关注"Oracle和跨页选择",这涉及到数据库查询中的分页操作,对于新手来说是理解和掌握数据库使用的重要一环。 在Oracle中,进行数据查询时,我们经常需要对结果集进行分页展示,以方便用户逐页浏览大量...

    oracle经典书籍(Oracle 9i初学者指南.zip、Oracle专家高级编程.pdf、Effective+Oracle+by+Design.pdf)

    对于Oracle新手来说,“Oracle 9i初学者指南.zip”是一个良好的起点,能够帮助他们建立起对数据库管理的基本理解。对于那些已经有一定基础的开发者,“Oracle专家高级编程.pdf”则可以作为进阶学习的教材,通过深入...

    Oracle数据库中文手册

    总的来说,"Oracle数据库中文手册"是一本全面的参考资料,无论你是Oracle新手还是经验丰富的DBA,都能从中找到你需要的知识。通过深入学习和实践,可以提升你在Oracle数据库管理和应用上的专业能力。

    Oracle教程.rar

    本教程由任老师精心编撰,涵盖了Oracle的基本使用方法以及高级PL/SQL编程技巧,包括存储过程和游标等关键概念。 首先,Oracle是一个关系型数据库管理系统(RDBMS),在企业级数据管理和分析中广泛应用。它提供了...

    oracle的pdf

    这些资料全面覆盖了Oracle数据库的基础知识、进阶技能以及特定领域的应用,无论是对刚接触Oracle的新手,还是寻求提升技能的资深DBA,都能从中获益匪浅。通过系统学习,你可以掌握Oracle数据库的设计、管理和维护,...

    oracle新手入门

    以下是一些Oracle新手入门的知识点: 1. **安装与配置**: 首先,你需要下载并安装Oracle数据库软件,如Oracle Database Express Edition (XE) 或其他版本。安装过程中会涉及到环境变量设置、监听配置和数据库实例...

    Oracle技术手册。。。人人软件站

    Oracle技术手册是数据库管理员、开发人员以及对Oracle数据库系统感兴趣的 IT 专业人士的重要参考资料。...无论是新手还是经验丰富的DBA,这份资源都将为你的Oracle知识体系添砖加瓦,助你在IT领域取得成功。

    Oracle编程入门经典

    总而言之,Oracle编程入门经典是一本全面介绍Oracle数据库基础知识和编程实践的教程,无论你是初次接触Oracle的新手还是希望巩固基础的开发者,都能从中受益匪浅。通过学习和实践,你将能够熟练地在Oracle环境中编写...

    Oracle中文帮助与学习资料大全 最新

    1. **Oracle+PLSQL+语法手册.chm**:这是一部关于Oracle的PL/SQL编程语言的手册,涵盖了PL/SQL的基础语法、控制结构、异常处理、游标、存储过程和函数等核心概念。PL/SQL是Oracle数据库的内置过程语言,用于编写...

    oracle新手入门笔记

    以下是一些Oracle入门的重要知识点: 1. **用户管理**:在Oracle中,`USER`是数据库的一个关键概念,用于区分不同的数据库用户。你可以通过`SELECT USER FROM DUAL;`来查看当前登录的用户。`ALTER USER`命令用于...

    Oracle PL_SQL Language Pocket Reference, 5th Edition.2015.pdf

    ### Oracle PL/SQL 语言袖珍参考...综上所述,《Oracle PL/SQL 语言袖珍参考手册》(第五版)是一本针对Oracle PL/SQL语言开发者的必备参考书,无论是对于新手还是经验丰富的开发者而言,都能从中获得有价值的信息。

    Oracle新手入门借鉴.pdf

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,对于新手来说,了解其基本的SQL语法和操作是入门的关键。本文将详细解析Oracle中的数据定义语言(DDL)和一些基础概念。 首先,我们来看创建表的语句。在...

    Oracle 11g SQL Fundamentals I

    11. **游标**:学习游标的使用,提高数据处理效率。 12. **存储过程与函数**:了解如何编写PL/SQL代码实现更复杂的数据处理逻辑。 #### 四、作者和技术贡献者 文档中列出了多位作者和技术贡献者的名字,他们是: - ...

    oracle基础基础教程(非常适合初学者)

    本教程针对初学者,旨在提供全面而深入的Oracle基础知识,帮助新手快速掌握这一强大的数据库系统。 1. 数据库概述:Oracle数据库是Oracle公司开发的、基于SQL标准的关系型数据库系统。它提供了数据存储、管理、查询...

Global site tag (gtag.js) - Google Analytics