`

游标语法

 
阅读更多

drop table student;
create table student
(
	stuNo int primary key,
	Name varchar2(10),
	address varchar2(30),
	birthday date
);

insert into student values(1,'梅超风','山东',to_date('1860-02-12 12:12:23','YYYY-MM-DD HH24:MI:SS'));
insert into student values(2,'陆成风','山西',to_date('1860-2-12','YYYY-MM-DD'));
insert into student values(3,'冯默风','安徽','10-2月-1886');
insert into student values(4,'曲灵风','湖南常德',to_date('1870-02-12 12:12:23','YYYY-MM-DD HH24:MI:SS'));


Rem ===================================================================
Rem 隐式游标 
Rem ===================================================================

SET SERVEROUTPUT ON;
BEGIN
	UPDATE student SET address='河南洛阳'
	WHERE stuNo = 1;
	IF SQL%FOUND THEN
		DBMS_OUTPUT.PUT_LINE('表已更新');
	END IF;
END;
/

BEGIN
	UPDATE student SET address=replace(address,'南','北') 
	WHERE address LIKE '%南%';
	IF SQL%NOTFOUND THEN
		DBMS_OUTPUT.PUT_LINE('未找到数据........');
	ELSE
		DBMS_OUTPUT.PUT_LINE('影响了'||SQL%ROWCOUNT||'行');
	END IF;
END;
/

Rem ===================================================================
Rem 显式游标 
Rem ===================================================================
--使用游标显示name列的值
DECLARE
	l_name VARCHAR2(20);
	CURSOR stu_name_cur IS SELECT name from student;
BEGIN
	OPEN stu_name_cur;		--打开游标
	LOOP
		FETCH stu_name_cur INTO l_name;
		DBMS_OUTPUT.PUT_LINE(stu_name_cur%ROWCOUNT);
		EXIT WHEN stu_name_cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE('姓名:'||l_name);
	END LOOP;
	CLOSE stu_name_cur;		--关闭游标
END;
/


--带参数的游标
DECLARE
	l_name VARCHAR2(20);
	l_stuNO NUMBER(2);
	CURSOR stu_name_cur(sNo NUMBER) 
		IS SELECT name from student
			WHERE stuNo>sNo;
BEGIN
	l_stuNO:=&stuNO;
	OPEN stu_name_cur(l_stuNO);		--打开游标
	LOOP
		FETCH stu_name_cur INTO l_name;

		EXIT WHEN stu_name_cur%NOTFOUND;

		DBMS_OUTPUT.PUT_LINE('姓名:'||l_name);
	END LOOP;
	CLOSE stu_name_cur;		--关闭游标
END;
/

Rem ===================================================================
Rem 使用显示游标修改数据 
Rem ===================================================================

DECLARE
	l_birthday DATE;
	l_stuNO NUMBER(2);
	CURSOR stu_name_cur(sNo NUMBER) 
		IS SELECT birthday from student
			WHERE stuNo>sNo FOR UPDATE OF birthday;
BEGIN
	l_stuNO:=&stuNO;
	OPEN stu_name_cur(l_stuNO);		--打开游标
	LOOP
		FETCH stu_name_cur INTO l_birthday;
		EXIT WHEN stu_name_cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE('出生年月:'||to_char(l_birthday,'yyyy"年"mm"月"dd"日"'));
		UPDATE student SET birthday=ADD_MONTHS(l_birthday,2)
			WHERE CURRENT OF stu_name_cur;   --更新当前行
	END LOOP;
	CLOSE stu_name_cur;		--关闭游标
	COMMIT;
END;
/

Rem ===================================================================
Rem 使用显示游标删除记录
Rem ===================================================================

DECLARE 
l_stu_rec student%ROWTYPE;
CURSOR del_cur IS select * from student FOR UPDATE;
BEGIN
	OPEN del_cur;
	LOOP
		FETCH del_cur into l_stu_rec;
		EXIT WHEN del_cur%NOTFOUND;
		IF l_stu_rec.stuno=2 THEN
			DELETE FROM student WHERE CURRENT OF del_cur; --删除当前行
		END IF;
	END LOOP;
END;
/

Rem ===================================================================
Rem 循环游标 
Rem ===================================================================

DECLARE
	CURSOR stu_cur IS
		SELECT stuNo,name,address FROM student;
BEGIN
	FOR stu IN stu_cur		--不要加分号
	LOOP
		DBMS_OUTPUT.PUT_LINE(stu.stuNO||'   '||stu.name||'   '||stu.address);
	END LOOP;
END;
/

Rem ===================================================================
Rem 弱类型REF游标 
Rem ===================================================================

DECLARE
	sNo student.stuNo%type;
	sName student.name%type;
	sAddress student.address%type;
	
	TYPE stu_cur_ref IS REF CURSOR;		--声明REF游标类型
	stu_cur stu_cur_ref;			--声明“stu_cur_ref”游标类型变量
BEGIN
	OPEN stu_cur FOR
		SELECT stuNo,name,address FROM student;
	LOOP
		FETCH stu_cur INTO sNo,sName,sAddress;
		EXIT WHEN stu_cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE(sNo||'   '||sName||'   '||sAddress);
	END LOOP;
	CLOSE stu_cur;
END;
/

DECLARE
  l_stuno student.stuno%TYPE;
  l_name student.name%TYPE;
  TYPE stu_cur_ref IS REF CURSOR;
  curStu stu_cur_ref;
BEGIN
	OPEN curStu FOR
	  SELECT stuno,name FROM student;
	LOOP
	  FETCH curStu INTO l_stuno,l_name;
	  EXIT WHEN curStu%NOTFOUND;
	  DBMS_OUTPUT.PUT_LINE(l_stuno||'  '||l_name);
	END LOOP;
	CLOSE curStu;
END;
/

Rem ===================================================================
Rem 强类型REF游标 
Rem ===================================================================

DECLARE
	TYPE l_stu_type IS RECORD(		--自定义记录类型
		sNo student.stuNo%type,
		sName student.name%type,
		sAddress student.address%type
	);
	l_stu l_stu_type;			--声明自定义类型变量
	TYPE stu_cur_ref IS REF CURSOR		--声明REF游标类型
		RETURN l_stu_type;		--返回类型为自定义类型
	stu_cur stu_cur_ref;			--声明“stu_cur_ref”游标类型变量
BEGIN
	OPEN stu_cur FOR
		SELECT stuNo,name,address FROM student;
	LOOP
		FETCH stu_cur INTO l_stu;
		EXIT WHEN stu_cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE(l_stu.sNo||'   '||
		l_stu.sName||'   '||l_stu.sAddress);
	END LOOP;
	CLOSE stu_cur;
END;
/

DECLARE 
  TYPE l_stu_type IS RECORD(
  	sno student.stuno%TYPE,
  	sname student.name%TYPE
  );
  l_stu l_stu_type;
  TYPE stu_cur_ref IS REF CURSOR RETURN l_stu_type;
  stu_cur stu_cur_ref;
BEGIN
	OPEN stu_cur FOR
	   SELECT stuno,name FROM student;  
	LOOP
	  FETCH stu_cur INTO l_stu;
	  EXIT WHEN stu_cur%NOTFOUND;
	  DBMS_OUTPUT.PUT_LINE(l_stu.sno||'  '||l_stu.sname);
	END LOOP;
	CLOSE stu_cur;
END;
/

Rem ===================================================================
Rem 使用游标变量执行动态 SQL 
Rem ===================================================================

DECLARE
	l_stu student%ROWTYPE;			
	TYPE stu_cur_ref IS REF CURSOR;		--声明REF游标类型
	stu_cur stu_cur_ref;			--声明“stu_cur_ref”游标类型变量
	l_stuNo NUMBER(2);
BEGIN
	l_stuNo := &sNo;
	OPEN stu_cur FOR
		'SELECT * FROM student WHERE stuNo>:1'
			USING l_stuNo;   --绑定参数
	LOOP
		FETCH stu_cur INTO l_stu;
		EXIT WHEN stu_cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE(l_stu.stuNo||'   '||l_stu.name||'   '||l_stu.address||
			'   '||l_stu.birthday);
	END LOOP;
	CLOSE stu_cur;
END;
/





分享到:
评论

相关推荐

    Oracle游标语法总结.doc

    Oracle 游标语法总结 Oracle 游标是指用于查询数据库、获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。游标是 Oracle 中一个非常重要的概念,它允许开发者高效地访问和处理...

    Oracle游标使用方法及语法大全.doc

    ### Oracle游标使用详解 #### 一、游标概述 游标是Oracle数据库中用于处理查询结果集的强大工具,尤其适用于需要逐行处理查询结果的情况。在Oracle中,游标可以分为两类:**显式游标**和**隐式游标**。 1. **隐式...

    Oracle游标使用方法及语法大全

    Oracle 游标使用方法及语法大全 Oracle 游标是 PL/SQL 程序中的一种重要组件,用于处理查询结果集。游标可以分为隐式游标和显式游标两种,隐式游标由 PL/SQL 管理,隐式游标打开时查询开始,查询结束时隐式游标自动...

    Oracle游标使用方法及语法大全[整理].pdf

    Oracle游标是数据库编程中非常重要的一个概念,主要用于处理SQL查询返回的多行结果集。在PL/SQL中,游标分为隐式游标和显式游标。 1. **隐式游标**:在PL/SQL中,每当执行一个SELECT语句时,系统会自动打开一个隐式...

    SQL Server 事务 游标 基本语法操作实例 全SQL语句

    定义游标的基本语法如下: ```sql DECLARE @cursorName CURSOR; SET @cursorName = CURSOR FOR SELECT column1, column2 FROM table WHERE condition; OPEN @cursorName; FETCH NEXT FROM @cursorName INTO @...

    了解orcale的游标的使用 和应用

    了解orcale的游标的使用 和应用

    使用游标更新数据库

    使用游标更新数据库的语法形式如下: ``` CURSOR cursor_name IS SELECT 语句 FOR UPDATE [OF column[, column]] [NOWAIT] ``` 其中,OF 子句用来指定要锁定的列,如果忽略了 OF 子句,那么表中选择的数据行都将被...

    sql 游标详解

    ### SQL 游标详解 #### 一、游标的基本概念 在SQL中,游标是一种特殊的指针,用于逐行地检索查询结果。...通过理解和掌握游标的基本概念、语法结构及其高级特性,开发人员可以在适当的情况下有效地利用这一工具。

    sql游标 cursor

    在SQL Server中,声明游标的语法如下: ```sql DECLARE <cursor_name> CURSOR FOR SELECT column_list FROM table_name [WHERE conditions]; ``` 例如,在给定的部分内容中,游标`d_cursor`被声明为: ```sql ...

    存储过程技术分享 数据库存储过程.docx

    声明游标语法为`CURSOR cursor_name IS select_statement`。在Oracle中,通常通过`FOR`循环和`OPEN/FETCH/CLOSE`操作来使用游标。 3. 循环(For) 在PL/SQL中,可以使用`FOR`循环遍历集合,例如数组、表类型等。...

    游标最简单教程

    #### 二、游标的基本语法结构 游标的使用主要包括以下几个步骤: 1. **声明游标**:定义一个游标并关联到一个查询。 2. **打开游标**:使游标准备好读取数据。 3. **从游标中获取数据**:通常使用`FETCH`命令来获取...

    sql数据库常用操作

    #### 六、游标语法 游标允许逐行处理结果集,适用于需要按行处理数据的场景。 ```sql DECLARE cur_name CURSOR FOR SELECT * FROM temp_table; OPEN cur_name; FETCH FIRST FROM cur_name INTO @var1, @var2,...

    sql server 游标实例

    #### 二、游标的基本语法结构 创建和使用游标通常涉及以下几个步骤: 1. **声明游标**:使用`DECLARE`语句声明一个游标,并指定要从中检索数据的查询。 2. **打开游标**:使用`OPEN`语句打开游标,使其准备好读取...

    SQL语句\sql 游标总结

    此语句有两种语法声明格式,分别为 SQL 92 标准格式和 SQL Server 扩展(扩展了声明游标的参数)格式。 2.1 SQL-92 语法格式 语法:DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement ...

    2021-2022计算机二级等级考试试题及答案No.17190.docx

    - **声明游标语法:** 在SQL中,使用 `DECLARE` 语句声明游标,并指定游标关联的查询语句。 **分析:** - 正确的语法为 `DECLARE cursor_name CURSOR FOR select_statement`,其中 `cursor_name` 是游标名称,`...

    快速掌握Oracle数据库游标的使用方法

    声明游标需要使用 CURSOR 语句,语法为:CURSOR cursor_name IS select_statement;其中,cursor_name 是游标名,select_statement 是 SELECT 语句。在声明游标时,游标名是一个未声明变量,不能给游标名赋值或用于...

    SQL游标原理和使用方法

    2. 在Oracle中,游标操作类似,但语法略有不同,例如使用%ROWTYPE关键字自动创建变量以匹配结果集的列。 3. MySQL提供简单的游标支持,但不支持滚动游标,只支持FOR UPDATE的游标,用于在事务中锁定行。 三、游标...

Global site tag (gtag.js) - Google Analytics