Orace游标:
一、游标简介:
使用游标,我们可以对具体操作数据,比如查询的结果,对行,列数据进行更加细致的处理。以及对其他DML操作进行判断等操作;
二、显示游标:
1.静态的指定变量类型:
SQL> declare cursor cu_emp is select empno,ename,sal from emp; 2 e_no number; 3 e_name varchar2(10); 4 e_sal number; 5 begin 6 open cu_emp; 7 fetch cu_emp into e_no, e_name, e_sal; 8 while cu_emp%found loop 9 dbms_output.put_line('编号:'||e_no||',姓名:'||e_name||',基本薪资:'||e_sal); 10 fetch cu_emp into e_no, e_name, e_sal; 11 end loop; 12 close cu_emp; 13 end; 14 / 编号:7369,姓名:SMITH,基本薪资:800 编号:7499,姓名:ALLEN,基本薪资:1600 编号:7521,姓名:WARD,基本薪资:1250 编号:7566,姓名:JONES,基本薪资:2975 编号:7654,姓名:MARTIN,基本薪资:1250 编号:7698,姓名:BLAKE,基本薪资:2850 编号:7782,姓名:CLARK,基本薪资:2450 编号:7788,姓名:SCOTT,基本薪资:3000 编号:7839,姓名:KING,基本薪资:5000 编号:7844,姓名:TURNER,基本薪资:1500 编号:7876,姓名:ADAMS,基本薪资:1100 编号:7900,姓名:JAMES,基本薪资:950 编号:7902,姓名:FORD,基本薪资:3000 编号:7934,姓名:MILLER,基本薪资:1300 PL/SQL 过程已成功完成。
2.动态指定变量类型:
SQL> declare cursor cu_emp is select empno,ename,sal from emp; 2 e_no emp.empno%type; 3 e_name emp.ename%type; 4 e_sal emp.sal%type; 5 begin 6 open cu_emp; 7 fetch cu_emp into e_no, e_name, e_sal; 8 while cu_emp%found loop 9 dbms_output.put_line('编号:'||e_no||',姓名:'||e_name||',基本薪资:'||e_sal); 10 fetch cu_emp into e_no, e_name, e_sal; 11 end loop; 12 close cu_emp; 13 end; 14 / 编号:7369,姓名:SMITH,基本薪资:800 编号:7499,姓名:ALLEN,基本薪资:1600 编号:7521,姓名:WARD,基本薪资:1250 编号:7566,姓名:JONES,基本薪资:2975 编号:7654,姓名:MARTIN,基本薪资:1250 编号:7698,姓名:BLAKE,基本薪资:2850 编号:7782,姓名:CLARK,基本薪资:2450 编号:7788,姓名:SCOTT,基本薪资:3000 编号:7839,姓名:KING,基本薪资:5000 编号:7844,姓名:TURNER,基本薪资:1500 编号:7876,姓名:ADAMS,基本薪资:1100 编号:7900,姓名:JAMES,基本薪资:950 编号:7902,姓名:FORD,基本薪资:3000 编号:7934,姓名:MILLER,基本薪资:1300 PL/SQL 过程已成功完成。
3.行类型:%rowtype:
SQL> declare cursor cu_emp is select * from emp; 2 e emp%rowtype; 3 begin 4 open cu_emp; 5 fetch cu_emp into e; 6 while cu_emp%found loop 7 dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||',基本薪资:'||e.sal); 8 fetch cu_emp into e; 9 end loop; 10 close cu_emp; 11 end; 12 / 编号:7369,姓名:SMITH,基本薪资:800 编号:7499,姓名:ALLEN,基本薪资:1600 编号:7521,姓名:WARD,基本薪资:1250 编号:7566,姓名:JONES,基本薪资:2975 编号:7654,姓名:MARTIN,基本薪资:1250 编号:7698,姓名:BLAKE,基本薪资:2850 编号:7782,姓名:CLARK,基本薪资:2450 编号:7788,姓名:SCOTT,基本薪资:3000 编号:7839,姓名:KING,基本薪资:5000 编号:7844,姓名:TURNER,基本薪资:1500 编号:7876,姓名:ADAMS,基本薪资:1100 编号:7900,姓名:JAMES,基本薪资:950 编号:7902,姓名:FORD,基本薪资:3000 编号:7934,姓名:MILLER,基本薪资:1300 PL/SQL 过程已成功完成。
上面的也可以查询带条件:
SQL> declare cursor cu_emp is select * from emp where sal > 2000 and sal < 3000; 2 e emp%rowtype; 3 begin 4 open cu_emp; 5 fetch cu_emp into e; 6 while cu_emp%found loop 7 dbms_output.put_line('编号:'||e.empno||',姓名:'||e.ename||', 基本薪资:'||e.sal); 8 fetch cu_emp into e; 9 end loop; 10 close cu_emp; 11 end; 12 / 编号:7566,姓名:JONES,基本薪资:2975 编号:7698,姓名:BLAKE,基本薪资:2850 编号:7782,姓名:CLARK,基本薪资:2450 PL/SQL 过程已成功完成。