隐式游标
隐式游标的属性等在第四章笔记中已记录了一部分
如果要确保属性指向想要的SQL语句,那么就在SQL语句执行后,立即将属性值保存到一个本地变量中
用存储过程来实现这种效果:
先定义一个存储过程remove_from_emp ,用于从雇员中删除一个员工
在存储过程的参数中 in 表示输入,out 表示输出
create or replace procedure remove_from_emp(empno_in in employee.empno%type)
is
begin
delete from employee where empno = empno_in;
dbms_output.put_line('删除了' || sql%rowcount || '条记录!');
end;
/
-- 定义一个存储过程来调用存储过程remove_from_emp,并保存隐式游标的属性值
create or replace procedure show_emp_count is
i_count integer;
i_numfound pls_integer;
begin
select count(*) into i_count from employee;
-- 将属性值做一个快照
i_numfound := sql%rowcount;
-- 注意employee表中没有编号为99的员工
-- 调用存储过程remove_from_emp
remove_from_emp(1);
-- 现在可以用前一条语句的属性值输出
dbms_output.put_line(i_numfound);
end;
/
显式游标(PL/SQL块中使用显示游标的本个步骤:声明、打开、提取记录、关闭)
在程序包规范中声明一个游标类型(我们可以在PL/SQL块或者包的定义部分声明游标类型)
create or replace package types
is
type emp_cur5 is ref cursor;
end;
/
declare
-- 定义一个不带参数的游标emp_cur1,游标的结果是employee表中员工的集合
cursor emp_cur1 is select * from employee;
-- 定义一个带参数的游标emp_cur2,游标的结果集是匹配由游标传递过来的员工编号的员工姓名和加入公司的时间
cursor emp_cur2 (empno_in in number) is select name,hiredate from employee where empno = empno_in;
-- 定义一个带有return 子句的游标,游标的结果集是员工编号为1的employee表中所有的列
cursor emp_cur3 return employee%rowtype is select * from employee where empno = 1;
如果想通过游标更新数据,必须在select 语句后加上for update 子句,
该select 语句涉及的所有行都会被锁住
如果是加上了for update of 列名,那么只有在for update 子句中引用了某个表的列时,
该表中的行才会被锁住,of 列表并不限制只能更改列给出的列,它只让我们知道要更改什么
可以在for update 子句后添加一个nowait 关键字,用于告诉Oracle如果表已经被其他用户
锁住,就不需要等待了,这样控制权会立即返回给我们的程序,如果没有nowait子句进程就
会阻塞,直到表可用(commit或rollback)为止
可以在Select into、Fetch into、Returning into子句中使用Bulk Collect将数据输出到集合中
cursor emp_cur4 (empno_in in number) is select name,salary from employee where empno = empno_in for update;
-- 应该总是将游标行提取到用%rowtype定义的记录中,这样更灵活(表字段改变了不需要更改fetch语句)
emp_row1 employee%rowtype;
-- 基于游标定义一个记录
emp_row2 emp_cur2%rowtype;
emp_row3 emp_cur3%rowtype;
emp_row4 emp_cur4%rowtype;
n_salary number(10,2);
n_empno employee.empno%type := &员工编号:;
-- 游标变量和ref cursor
-- 定义ref cursor 类型的游标变量
-- 创建一个强类型的引用游标类型
type emp_ref_type1 is ref cursor return employee%rowtype;
-- 创建一个弱类型的引用游标类型(弱类型的游标变量比强类型的游标变量更灵活)
type emp_ref_type2 is ref cursor;
-- 定义实际的游标变量
emp_ref1 emp_ref_type1;
emp_ref2 emp_ref_type2;
-- 从Oracle9i 开始提供了一个名为sys_refcursor的预定义的Oracle系统游标,
-- 它相当于弱类型游标,使用它不需要定义游标变量
sys_cursor sys_refcursor;
-- 定义一个行类型的集合
type emp_table_type is table of employee%rowtype index by binary_integer;
emp_table emp_table_type;
type emp_info_type is record(name employee.name%type,job employee.job%type);
emp_info emp_info_type;
begin
打开游标:open 显式游标名 (参数列表)
一旦打开了显式游标,就可以从游标中提取记录,直到没有记录留在游标中
打开游标时,PL/SQL就开始执行该游标的Select 查询,但是实际上并不返回任何行,
返回行的任务是由后面的Fetch(读取)…… into(赋值给)…… 语句完成的:
fetch 游标名 into 记录或变量列表
open emp_cur1;
-- 提取记录
-- 如果游标只返回一行可以用if、loop或for来判断获得数据,如果游标返回多行可以用loop或for来循环获得数据
loop
fetch emp_cur1 into emp_row1;
exit when emp_cur1%notfound;
dbms_output.put_line('员工' || emp_row1.name || '的工资是:' || emp_row1.salary);
end loop;
-- 关闭游标并释放资源
close emp_cur1;
-- 打开带参数的游标
-- 游标for 循环能很好的简化游标的开发,我们不再需要声明记录,不再需要Open、Fetch和Close语句
-- 也不再需要%found属性检测记录,一切Oracle隐式的帮我们完成了
for emp_row2 in emp_cur2(n_empno) loop
dbms_output.put_line('员工' || emp_row2.name || '加入公司的时间是 ' || emp_row2.hiredate);
end loop;
-- 打开带return 子句的游标
open emp_cur3;
fetch emp_cur3 into emp_row3;
if emp_cur3%found then
dbms_output.put_line('员工' || emp_row3.name || '其职位是' || emp_row3.job || ',加入公司的时间是 ' || emp_row3.hiredate);
end if;
close emp_cur3;
-- 打开带for update 子句的游标,将指定编号的员工工资增加500元
open emp_cur4(n_empno);
fetch emp_cur4 into emp_row4;
where current of 游标名 子句能很容易的修改最近提取的数据行(也就是当前游标指向的位置),
这样的好处是,如果表表结构发生了改变,我们只需要更改Select语句的Where子句即可,而不
需要更新每个SQL语句
if emp_cur4%found then
update employee set salary = salary + 500 where current of emp_cur4; --returning salary into n_salary;
end if;
commit;
n_salary := emp_row4.salary + 500;
dbms_output.put_line('员工' || emp_row4.name || '原来的工资是' || emp_row4.salary || '元,增加工资后现在的工资是' || n_salary || '元');
close emp_cur4;
-- 打开强类型游标变量
open emp_ref1 for select * from employee order by salary;
-- 在游标变量中提取数据
fetch emp_ref1 bulk collect into emp_table;
for i in 1..emp_table.count loop
dbms_output.put_line(emp_table(i).name || ' 本月工资 ' || emp_table(i).salary);
end loop;
-- 关闭游标变量
close emp_ref1;
-- 打开弱类型游标变量
open emp_ref2 for select name,job from employee;
loop
fetch emp_ref2 into emp_info;
exit when emp_ref2%notfound;
dbms_output.put_line(emp_info.name || '的工作是 ' || emp_info.job);
end loop;
close emp_ref2;
-- 打开Oracle系统游标
open sys_cursor for select name,hiredate from employee order by hiredate desc;
loop
fetch sys_cursor into emp_info;
exit when sys_cursor%notfound;
dbms_output.put_line(emp_info.name || '加入公司的时间是 ' || emp_info.job);
end loop;
close sys_cursor;
exception
when NO_DATA_FOUND then dbms_output.put_line('查询不到员工编号为' || n_empno || '的员工!');
when TOO_MANY_ROWS then dbms_output.put_line('数据完整性错误,员工编号' || n_empno || '重复!');
when OTHERS then dbms_output.put_line('PL/SQL执行错误!' || sqlerrm);
end;
/
论文原地址:http://www.iteye.com/topic/624079
分享到:
相关推荐
根据提供的文件信息,我们可以总结出以下SQL数据库使用游标及随机插入数据的相关知识点: ### SQL 游标的使用 #### 1. 游标定义 游标是数据库中的一个临时存储区域,它允许用户通过逐行的方式处理结果集中的数据。...
LabVIEW的波形图表对象提供了获取数据点坐标的方法。通过使用“查询数据点”函数,我们可以将点击的屏幕坐标转换为实际数据坐标。这个函数需要屏幕坐标以及波形图表的范围信息作为输入,然后返回相应的数据值。 ...
在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这样的图形化编程环境中,波形图游标功能使得工程师和科学家能够直观地分析波形数据,并获取特定时刻的值或者比较不同信号之间的相位差。...
1. **性能问题**:虽然游标提供了一种灵活的方式来处理数据,但是频繁地使用游标可能会导致性能下降。这是因为每次循环都需要与数据库进行交互,增加了I/O操作次数。 2. **资源占用**:游标会占用一定的系统资源,...
数据游标(Data Cursor)是MATLAB图形用户界面(GUI)中的一种功能,它允许用户在图形上放置可移动的标记,以便获取或编辑特定数据点的信息。当你在图窗口中激活数据游标时,你可以点击图上的任意点,此时会显示该点...
本示例展示了如何使用Oracle PL/SQL中的游标来进行数据的分组统计,并通过程序逻辑实现了一种类似“行转列”的效果。这对于初学者来说是非常有价值的实践案例,可以帮助他们更好地理解游标的工作原理及其应用。同时...
在处理大量数据时,传统的分页方式可能会导致内存溢出,这时可以使用游标滚动来实现高效的分页。本篇文章将深入探讨如何利用JdbcTemplate结合游标滚动来解决分页问题。 首先,我们要理解什么是游标滚动。在数据库中...
打开游标后,可以使用`FETCH`命令获取数据并将其存储在预先声明的变量中: ```sql DECLARE @SomeVariable VARCHAR(50); FETCH NEXT FROM MYC INTO @SomeVariable; ``` 在循环中,可以多次使用`FETCH`命令来处理每...
3. 获取数据:通过`FETCH NEXT`从游标中获取下一行数据,可以使用` INTO`关键字将数据存储到变量中。 4. 处理数据:根据业务需求,对获取的数据执行操作。 5. 关闭和释放游标:完成数据处理后,使用`CLOSE`关闭游标...
获取游标坐标意味着我们需要获取游标在图表上X轴(时间)和Y轴(数据值)的精确位置。 "设置游标参数"是配置游标的行为和外观的过程,包括游标的颜色、形状、透明度、精度等。这可以通过LabVIEW的属性节点或者控件...
通常,我们使用 fetch some_cursor into var1, var2 形式来获取游标数据,当游标中的记录数不多时不打紧。然而,当游标中的记录数非常大时,这种方式的效率将变得非常低下。 Oracle 8i 起,Oracle 为我们提供了 ...
在循环内部,利用"fetch"命令从游标中获取每行数据,并将其放入变量中,同时通过"print"语句输出学生的信息。 以上是根据文档内容整理的相关知识点,涵盖了SQL游标的基本使用方法、操作步骤以及注意事项,目的是使...
3. **获取数据**:通过`FETCH`语句从游标中取出一条记录,并将字段值赋给变量。在此案例中,我们声明了两个变量`@PGI_ITM_CODE`和`@PGI_ListPrice`来存储游标中的数据。 ```sql fetch from MyTestCursor into @PGI_...
1. **逐行处理数据**:通过游标,可以按需获取数据集中的每一行。 2. **灵活的数据操作**:可以对数据进行修改或删除等操作。 3. **提高性能**:对于大数据集,避免一次性加载所有数据到内存中,从而提高系统性能。 ...
- **提取数据**:使用`FETCH`语句从游标中获取一行数据,并将其存储在变量中。 - **循环处理**:通常使用`WHILE`循环结合`%FOUND`或`%NOTFOUND`来遍历游标中的每一行。 - **关闭游标**:使用`CLOSE`语句关闭游标...
游标在数据库编程中扮演着重要角色,它们允许程序员逐行处理查询结果,而不仅仅是一次性获取所有数据。在数据库管理系统(如Oracle、SQL Server、MySQL等)中,游标是实现交互式数据处理的关键工具。下面我们将深入...
3. **提取数据**(`FETCH`):从游标中获取一行数据,并将其存储到变量中。 4. **关闭游标**(`CLOSE`):释放游标当前持有的数据,但不销毁游标本身。 5. **释放游标**(`DEALLOCATE`):彻底销毁游标,释放其占用...
- **从游标提取数据**:使用FETCH语句从游标中获取数据,可以循环执行此步骤,直到没有更多行可供处理。 通过熟练掌握Oracle数据库游标,开发者可以编写出更加灵活和高效的数据库应用程序,处理大数据量时能有效...
显式游标需要开发者明确声明、打开、获取数据以及关闭。在使用显式游标时,通常通过循环结构来迭代游标中的数据。游标循环有多种实现方式,包括使用loop循环、while循环和for循环。每种循环方式有其特定的场景和优势...
- 游标必须先用OPEN打开,然后使用FETCH获取数据,最后用CLOSE关闭。 - 应该始终处理可能的异常,如NO_DATA_FOUND,以避免程序中断。 总之,Oracle游标是处理数据库查询结果的关键工具,尤其是在需要逐行处理数据或...