扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
两种方法\x0d\x0a1.声明游标时写好SELECT语句,如\x0d\x0aCURSOR r_cur1 IS select *** from tableName where 条件;\x0d\x0a使用时\x0d\x0a OPEN r_cur1;\x0d\x0a LOOP\x0d\x0a FETCH *** INTO variable;\x0d\x0a EXIT WHEN r_cur1%NOTFOUND OR r_cur1%NOTFOUND IS NULL;\x0d\x0a。。。\x0d\x0a2.声明游标\x0d\x0accc sys_refcursor;\x0d\x0a使用时\x0d\x0a open ccc for select dept_code,dept_name from comm.dept_dict; \x0d\x0a loop\x0d\x0a fetch ccc into aa,bb;\x0d\x0a exit when ccc%notfound;\x0d\x0a 。。。\x0d\x0a end loop;\x0d\x0a close ccc;
创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、成都网站建设、成都外贸网站建设、敖汉网络推广、微信小程序定制开发、敖汉网络营销、敖汉企业策划、敖汉品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供敖汉建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
Oracle中的游标分为显示游标和隐式游标。
显示游标:
显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;显示游标的操作:打开游标、操作游标、关闭游标;
隐式游标:
隐式游标是在执行插入(insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它。
本文主要介绍的是Oracle游标提取相关的数据的实际操作方案 首先我们要从Oracle游标中得到一行相关的数据 我个人提议你使用FETCH命令 当每一次提取数据后 Oracle游标都指向结果集的下一行 语法如下
FETCH cursor_name INTO variable[ variable ]
对于SELECT定义的Oracle游标的每一列 FETCH变量列表都应该有一个变量与之相对应 变量的类型也要相同
例
SET SERVERIUTPUT ON
DECLARE
v_ename EMP ENAME%TYPE;
v_salary EMP SALARY%TYPE;
CURSOR c_emp IS SELECT ename salary FROM emp;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename v_salary;
DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename
|| is || v_salary);
FETCH c_emp INTO v_ename v_salary;
DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename
|| is || v_salary);
FETCH c_emp INTO v_ename v_salary;
DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename
|| is || v_salary);
CLOSE c_emp;
END
这段代码无疑是非常麻烦的 如果有多行返回结果 可以使用循环并用Oracle游标属性为结束循环的条件 以这种方式提取数据 程序的可读性和简洁性都大为提高 下面我们使用循环重新写上面的程序
SET SERVERIUTPUT ON
DECLARE
v_ename EMP ENAME%TYPE;
v_salary EMP SALARY%TYPE;
CURSOR c_emp IS SELECT ename salary FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_ename v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT PUT_LINE( Salary of Employee || v_ename
|| is || v_salary);
END
lishixinzhi/Article/program/Oracle/201311/18889
Oracle游标分为显示游标和隐式游标
显示游标(Explicit Cursor):在PL/SQL程序中定义的 用于查询的游标称作显示游标
隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的 而且是在PL/SQL中使用UPDATE/DELETE语句时 Oracle系统自动分配的游标
一 显示游标
使用步骤
( )定义 ( )打开 ( )使用 ( )关闭
使用演示
首先创建测试用表STUDENT 脚本如下
( ) 使用WHILE循环处理游标
create or replace PROCEDURE PROC_STU AS
BEGIN
显示游标使用 使用while循环
declare
定义游标 名称为cur_stu
cursor cur_stu is
select stuno stuname from student order by stuno;
定义变量 存放游标取出的数据
v_stuno varchar( );
v_stuname varchar( );
begin
打开游标cur_stu
open cur_stu;
将游标的当前行取出存放到变量中
fetch cur_stu into v_stuno v_stuname;
while cur_stu%found 游标所指还有数据行 则继续循环
loop
打印结果
dbms_output PUT_LINE(v_stuno|| ||v_stuname);
继续将游标所指的当前行取出放到变量中
fetch cur_stu into v_stuno v_stuname;
end loop;
close cur_stu; 关闭游标
end;
END PROC_STU ;
( ) 使用IF ELSE代替WHILE循环处理游标
create or replace PROCEDURE PROC_STU AS
BEGIN
显示游标使用 使用if判断
declare
定义游标 名称为cur_stu
cursor cur_stu is
select stuno stuname from student order by stuno;
定义变量 存放游标取出的数据
v_stuno varchar( );
v_stuname varchar( );
begin
打开游标cur_stu
open cur_stu;
将游标的当前行取出存放到变量中
fetch cur_stu into v_stuno v_stuname;
loop
if cur_stu%found then 如果游标cur_stu所指还有数据行
打印结果
dbms_output PUT_LINE(v_stuno|| ||v_stuname);
继续将游标所指的当前行取出放到变量中
fetch cur_stu into v_stuno v_stuname;
else
exit;
end if;
end loop;
close cur_stu; 关闭游标
end;
END PROC_STU ;
( ) 使用FOR循环处理游标
create or replace PROCEDURE PROC_STU AS
BEGIN
显示游标使用 使用for循环
declare
定义游标 名称为cur_stu
cursor cur_stu is
select stuno stuname from student order by stuno;
begin
for stu in cur_stu
loop
dbms_output PUT_LINE(stu stuno|| ||stu stuname);
循环做隐含检查 %notfound
end loop;
自动关闭游标
end;
END PROC_STU ;
( ) 常用的使用EXIT WHEN处理游标
create or replace
PROCEDURE PROC_STU _ AS
BEGIN
显示游标使用 使用exit when循环
declare
定义游标 名称为cur_stu
cursor cur_stu is
select stuno stuname from student order by stuno;
定义变量 存放游标取出的数据
v_stuno varchar( );
v_stuname varchar( );
begin
打开游标cur_stu
open cur_stu;
loop
将游标的当前行取出存放到变量中
fetch cur_stu into v_stuno v_stuname;
exit when cur_stu%notfound; 游标所指还有数据行 则继续循环
打印结果
dbms_output PUT_LINE(v_stuno|| ||v_stuname);
end loop;
close cur_stu; 关闭游标
end;
END PROC_STU _ ;
二 隐式游标
使用演示
create or replace PROCEDURE PROC_STU AS
BEGIN
隐式游标使用
update student set stuname= 张燕广 where stuno= ;
如果更新没有匹配则插入一条新记录
if SQL%NOTFOUND then
insert into student(STUNO STUNAME AGE GENDER)
values( 张燕广 男 );
end if;
END PROC_STU ;
说明
所有的SQL语句在上下文区内部都是可执行的 因为都有一个游标指向上下文区 此游标就是
SQL游标 与现实游标不同的是 SQL游标在PL/SQL中不需要打开和关闭 而是在执行UPDATE
DELETE是自动打开和关闭
上面例子中就是通过SQL%NOTFOUND游标属性判断UPDATE语句的执行结果决定是否需要插入新记录 CREATE TABLE STUDENT (
STUNAME VARCHAR ( BYTE)
STUNO VARCHAR ( BYTE)
AGE NUMBER
GENDER VARCHAR ( CHAR)
lishixinzhi/Article/program/Oracle/201311/17531
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流