Oracle数据库中,使用fetch语句提取游标数据,fetch语句怎么理解呀!?哪位Oracle高手帮忙解释下.Thankyou

我在了解Oracle数据库中的游标时,遇到的这个问题,不知道如何理解fetch语句的概念。... 我在了解Oracle数据库中的游标时,遇到的这个问题,不知道如何理解fetch语句的概念。 展开
 我来答
rx_lj
推荐于2018-05-17
知道答主
回答量:39
采纳率:100%
帮助的人:8.6万
展开全部
游标有三种:隐式游标 ,显示游标,ref游标 ,下面对于每一种给你写一个例子!
1:隐式游标
使用DML语句和单行查询语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为 SQL
通过检查隐式游标的属性可以获得最近执行的DML 语句的信息
隐式游标的属性 (P134)
%FOUND – SQL 语句影响了一行或多行时为 TRUE
%NOTFOUND – SQL 语句没有影响任何行时为TRUE
%ROWCOUNT – SQL 语句影响的行数
%ISOPEN - 游标是否打开,隐式游标始终为FALSE
BEGIN
UPDATE t_student SET sname = '张三丰'
WHERE sid= ‘09001';
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('表已更新');
END IF;
END;

BEGIN
UPDATE emp SET deptno=20 WHERE empno=7839;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('编号未找到。');
ELSE
DBMS_OUTPUT.PUT_LINE(‘数据已更新');
END IF;
END;
DECLARE
v_no emp.empno%type;
v_name emp.ename%type;
BEGIN
v_no:= '&职员编号';
SELECT ename INTO v_name
FROM emp WHERE empno=v_no;
IF SQL%ROWCOUNT>0 THEN
DBMS_OUTPUT.PUT_LINE('职员的姓名是 '||v_name);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('职员未找到');
END;

2:显示游标
显式游标是由PL/SQL程序员定义和命名的游标
显式游标用于多行查询
显式游标需要在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开,取完数据后将其关闭
declare
v_name t_student.sname%type;
Cursor cur_stu Is select sname from t_student;
begin
Open cur_stu;
Loop
Fetch cur_stu Into v_name;
Exit When cur_stu%NotFound;
dbms_output.put_line('学生姓名:'||v_name);
End Loop;
Close cur_stu;
end;
declare
CURSOR c_emp IS
SELECT empno,ename,sal FROM emp ORDER BY sal;
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
Open c_emp;
Loop
Fetch c_emp Into v_empno,v_ename,v_sal;
Exit When c_emp%NotFound;
dbms_output.put_line(v_empno||’ ’||v_ename||’ ’||v_sal);
End Loop;
Close c_emp;
end;
带参数的游标
declare
v_deptno emp.deptno%type; --部门编号变量
cursor c_emp(dno number) is
select empno,ename,sal from emp where deptno=v_deptno;
r_emp c_emp%rowtype; --游标行
begin
v_deptno:='&部门编号'; --输入参数值
Open c_emp(v_deptno);--传递参数
Loop
Fetch c_emp Into r_emp;
Exit When c_emp%NotFound;
dbms_output.put_line(r_emp.empno||' '||r_emp.ename||' '||r_emp.sal);
End Loop;
Close c_emp;
end;
3:Ref游标
DECLARE
TYPE refcur IS REF CURSOR;
ref_cur refcur; --REF游标变量
rec_emp emp%rowtype; --员工行变量
rec_dept dept%rowtype; --部门行变量
selection VARCHAR2(1) := UPPER(SUBSTR('&tab',1,1));
BEGIN
IF selection = 'E' THEN
OPEN ref_cur FOR SELECT * FROM emp;
DBMS_OUTPUT.PUT_LINE('===员工信息===');
LOOP
EXIT WHEN ref_cur%NOTFOUND;--判断是否存在
FETCH ref_cur INTO rec_emp; --游标控制员工行
DBMS_OUTPUT.PUT_LINE('姓名:'||rec_emp.ename ||' 职务:'||rec_emp.job||
' 工资:'||rec_emp.sal);
END LOOP;
ELSIF selection = 'D' THEN
OPEN ref_cur FOR SELECT * FROM dept;
DBMS_OUTPUT.PUT_LINE('===部门信息===');
LOOP
FETCH ref_cur INTO rec_dept; --游标控制部门行
EXIT WHEN ref_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('编号:'||rec_dept.deptno ||' 名称'||rec_dept.dname||
' 地址:'||rec_dept.loc);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('请输入员工信息(E) 或 部门信息(D)');
RETURN;
END IF;
CLOSE ref_cur;
END;
仁科信息
2024-07-24 广告
Oracle EBS运维是确保企业资源规划系统稳定、高效运行的关键环节。它涵盖了系统监控、性能优化、故障排查与恢复等多方面内容。通过持续的监控和数据分析,运维团队能够及时发现并解决潜在问题,保障系统的稳定性和安全性。同时,他们还需要与业务部... 点击进入详情页
本回答由仁科信息提供
mailking2001
2011-10-02 · TA获得超过817个赞
知道小有建树答主
回答量:1037
采纳率:100%
帮助的人:755万
展开全部
fetch就是将游标里的数据取出来存放在变量里
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
C_毛纳儿彪
2011-10-05
知道答主
回答量:14
采纳率:0%
帮助的人:15.3万
展开全部
取出游标中指针位置行的数据赋给之前声明的变量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式