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 游标语法总结 Oracle 游标是指用于查询数据库、获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。游标是 Oracle 中一个非常重要的概念,它允许开发者高效地访问和处理...
### Oracle游标使用详解 #### 一、游标概述 游标是Oracle数据库中用于处理查询结果集的强大工具,尤其适用于需要逐行处理查询结果的情况。在Oracle中,游标可以分为两类:**显式游标**和**隐式游标**。 1. **隐式...
Oracle 游标使用方法及语法大全 Oracle 游标是 PL/SQL 程序中的一种重要组件,用于处理查询结果集。游标可以分为隐式游标和显式游标两种,隐式游标由 PL/SQL 管理,隐式游标打开时查询开始,查询结束时隐式游标自动...
Oracle游标是数据库编程中非常重要的一个概念,主要用于处理SQL查询返回的多行结果集。在PL/SQL中,游标分为隐式游标和显式游标。 1. **隐式游标**:在PL/SQL中,每当执行一个SELECT语句时,系统会自动打开一个隐式...
定义游标的基本语法如下: ```sql DECLARE @cursorName CURSOR; SET @cursorName = CURSOR FOR SELECT column1, column2 FROM table WHERE condition; OPEN @cursorName; FETCH NEXT FROM @cursorName INTO @...
了解orcale的游标的使用 和应用
使用游标更新数据库的语法形式如下: ``` CURSOR cursor_name IS SELECT 语句 FOR UPDATE [OF column[, column]] [NOWAIT] ``` 其中,OF 子句用来指定要锁定的列,如果忽略了 OF 子句,那么表中选择的数据行都将被...
### SQL 游标详解 #### 一、游标的基本概念 在SQL中,游标是一种特殊的指针,用于逐行地检索查询结果。...通过理解和掌握游标的基本概念、语法结构及其高级特性,开发人员可以在适当的情况下有效地利用这一工具。
在SQL Server中,声明游标的语法如下: ```sql DECLARE <cursor_name> CURSOR FOR SELECT column_list FROM table_name [WHERE conditions]; ``` 例如,在给定的部分内容中,游标`d_cursor`被声明为: ```sql ...
声明游标语法为`CURSOR cursor_name IS select_statement`。在Oracle中,通常通过`FOR`循环和`OPEN/FETCH/CLOSE`操作来使用游标。 3. 循环(For) 在PL/SQL中,可以使用`FOR`循环遍历集合,例如数组、表类型等。...
#### 二、游标的基本语法结构 游标的使用主要包括以下几个步骤: 1. **声明游标**:定义一个游标并关联到一个查询。 2. **打开游标**:使游标准备好读取数据。 3. **从游标中获取数据**:通常使用`FETCH`命令来获取...
#### 六、游标语法 游标允许逐行处理结果集,适用于需要按行处理数据的场景。 ```sql DECLARE cur_name CURSOR FOR SELECT * FROM temp_table; OPEN cur_name; FETCH FIRST FROM cur_name INTO @var1, @var2,...
#### 二、游标的基本语法结构 创建和使用游标通常涉及以下几个步骤: 1. **声明游标**:使用`DECLARE`语句声明一个游标,并指定要从中检索数据的查询。 2. **打开游标**:使用`OPEN`语句打开游标,使其准备好读取...
此语句有两种语法声明格式,分别为 SQL 92 标准格式和 SQL Server 扩展(扩展了声明游标的参数)格式。 2.1 SQL-92 语法格式 语法:DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement ...
- **声明游标语法:** 在SQL中,使用 `DECLARE` 语句声明游标,并指定游标关联的查询语句。 **分析:** - 正确的语法为 `DECLARE cursor_name CURSOR FOR select_statement`,其中 `cursor_name` 是游标名称,`...
声明游标需要使用 CURSOR 语句,语法为:CURSOR cursor_name IS select_statement;其中,cursor_name 是游标名,select_statement 是 SELECT 语句。在声明游标时,游标名是一个未声明变量,不能给游标名赋值或用于...
2. 在Oracle中,游标操作类似,但语法略有不同,例如使用%ROWTYPE关键字自动创建变量以匹配结果集的列。 3. MySQL提供简单的游标支持,但不支持滚动游标,只支持FOR UPDATE的游标,用于在事务中锁定行。 三、游标...