Oracle数据库中,使用fetch语句提取游标数据,fetch语句怎么理解呀!?哪位Oracle高手帮忙解释下.Thankyou
发布网友
发布时间:2022-04-08 01:28
我来回答
共3个回答
热心网友
时间:2022-04-08 02:57
游标有三种:隐式游标 ,显示游标,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;
热心网友
时间:2022-04-08 04:15
fetch就是将游标里的数据取出来存放在变量里
热心网友
时间:2022-04-08 05:50
取出游标中指针位置行的数据赋给之前声明的变量