游 标.docx
- 文档编号:9886820
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:17
- 大小:55.88KB
游 标.docx
《游 标.docx》由会员分享,可在线阅读,更多相关《游 标.docx(17页珍藏版)》请在冰点文库上搜索。
游标
游标
●隐式游标
SQL>--updateaddempsal10%indeptno=10
SQL>declare
2l_deptnot_emp.deptno%type;
3begin
4l_deptno:
=&no;
5updatet_empsetsal=sal*1.1wheredeptno=l_deptno;
6ifsql%foundthen
7dbms_output.put_line(sql%rowcount||'empupdated!
!
');
8endif;
9ifsql%notfoundthen
10dbms_output.put_line('updatedfailer!
!
');
11endif;
12ifsql%isopenthen
13dbms_output.put_line('isopen!
!
');
14else
15dbms_output.put_line('isclosed!
!
');
16endif;
17end;
18/
输入no的值:
10
原值4:
l_deptno:
=&no;
新值4:
l_deptno:
=10;
3empupdated!
!
isclosed!
!
PL/SQL过程已成功完成。
SQL>/
输入no的值:
20
原值4:
l_deptno:
=&no;
新值4:
l_deptno:
=20;
5empupdated!
!
isclosed!
!
PL/SQL过程已成功完成。
SQL>/
输入no的值:
30
原值4:
l_deptno:
=&no;
新值4:
l_deptno:
=30;
6empupdated!
!
isclosed!
!
PL/SQL过程已成功完成。
SQL>/
输入no的值:
40
原值4:
l_deptno:
=&no;
新值4:
l_deptno:
=40;
updatedfailer!
!
isclosed!
!
PL/SQL过程已成功完成。
●显示游标
不带参游标:
--显示部门10的员工信息:
1declare
2--l_deptnot_emp.deptno%type;
3l_empt_emp%rowtype;
4cursorcur_empisselect*fromt_empwheredeptno=10;
5begin
6opencur_emp;
7fetchcur_empintol_emp;
8dbms_output.put_line(l_emp.ename||''||
9l_emp.sal||''||
10l_emp.job||''||
11l_emp.deptno);
12fetchcur_empintol_emp;
13dbms_output.put_line(l_emp.ename||''||
14l_emp.sal||''||
15l_emp.job||''||
16l_emp.deptno);
17closecur_emp;
18*end;
SQL>/
CLARK2695MANAGER10
KING5500PRESIDENT10
PL/SQL过程已成功完成。
************************************************************************
用loop循环:
1declare
2l_empt_emp%rowtype;
3cursorcur_empisselect*fromt_empwheredeptno=10;
4begin
5opencur_emp;
6loop
7fetchcur_empintol_emp;
8exitwhencur_emp%notfound;
9dbms_output.put_line(l_emp.ename||''||
10l_emp.sal||''||
11l_emp.job||''||
12l_emp.deptno);
13endloop;
14closecur_emp;
15*end;
SQL>/
CLARK2695MANAGER10
KING5500PRESIDENT10
MILLER1430CLERK10
PL/SQL过程已成功完成。
****************************************************************
用while循环:
SQL>declare
2l_empt_emp%rowtype;
3cursorcur_empisselect*fromt_empwheredeptno=10;
4begin
5opencur_emp;
6fetchcur_empintol_emp;
7whilecur_emp%foundloop
8dbms_output.put_line(l_emp.ename||''||
9l_emp.sal||''||
10l_emp.job||''||
11l_emp.deptno);
12fetchcur_empintol_emp;
13endloop;
14closecur_emp;
15end;
16/
CLARK2450MANAGER10
KING5000PRESIDENT10
MILLER1300CLERK10
PL/SQL过程已成功完成。
带参游标:
--显示各部门的员工信息:
1declare
2l_deptnot_emp.deptno%type;
3l_empt_emp%rowtype;
4cursorcur_emp(v_deptnot_emp.deptno%type)
5is
6select*fromt_empwheredeptno=v_deptno;
7begin
8l_deptno:
=&no;
9opencur_emp(l_deptno);
10fetchcur_empintol_emp;
11whilecur_emp%foundloop
12dbms_output.put_line(l_emp.ename||''||
13l_emp.sal||''||
14l_emp.job||''||
15l_emp.deptno);
16fetchcur_empintol_emp;
17endloop;
18closecur_emp;
19*end;
SQL>/
输入no的值:
10
原值8:
l_deptno:
=&no;
新值8:
l_deptno:
=10;
CLARK2450MANAGER10
KING5000PRESIDENT10
MILLER1300CLERK10
PL/SQL过程已成功完成。
SQL>/
输入no的值:
20
原值8:
l_deptno:
=&no;
新值8:
l_deptno:
=20;
SMITH800CLERK20
JONES2975MANAGER20
SCOTT3000ANALYST20
ADAMS1100CLERK20
FORD3000ANALYST20
PL/SQL过程已成功完成。
**********************************************************************
--显示sal>2000,deptno=20的员工信息:
1declare
2l_deptnot_emp.deptno%type;
3l_salt_emp.sal%type;
4l_empt_emp%rowtype;
5cursorcur_emp(v_deptnot_emp.deptno%type,v_salt_emp.sal%type)
6is
7select*fromt_empwheredeptno=v_deptnoandsal>v_sal;
8begin
9l_deptno:
=&no;
10l_sal:
=&sal;
11opencur_emp(l_deptno,l_sal);
12loop
13fetchcur_empintol_emp;
14exitwhencur_emp%notfound;
15dbms_output.put_line(l_emp.ename||''||
16l_emp.sal||''||
17l_emp.deptno);
18endloop;
19closecur_emp;
20*end;
SQL>/
输入no的值:
20
原值9:
l_deptno:
=&no;
新值9:
l_deptno:
=20;
输入sal的值:
2000
原值10:
l_sal:
=&sal;
新值10:
l_sal:
=2000;
JONES297520
SCOTT300020
FORD300020
PL/SQL过程已成功完成。
*******************************************************************
只做查询的可以用for循环:
--查员工信息:
SQL>declare
2cursorcur_empisselect*fromt_emp;
3begin
4forcurincur_emploop
5dbms_output.put_line(cur.ename||''||
6cur.sal||''||
7cur.deptno);
8endloop;
9end;
10/
SMITH80020
ALLEN160030
WARD125030
JONES297520
MARTIN125030
BLAKE285030
CLARK245010
SCOTT300020
KING500010
TURNER150030
ADAMS110020
JAMES95030
FORD300020
MILLER130010
PL/SQL过程已成功完成。
***************8**************************************************
1declare
2cursorcur_empisselect*fromt_empwheredeptno=10;
3begin
4forcurincur_emploop
5dbms_output.put_line(cur.ename||''||cur.sal);
6endloop;
7*end;
SQL>/
CLARK1984.5
KING4050
MILLER1053
********************************************************************
1declare
2l_deptnot_emp.deptno%type;
3cursorcur_emp
4is
5select*fromt_empwheredeptno=l_deptno;
6begin
7l_deptno:
=&no;
8forcurincur_emploop
9dbms_output.put_line(cur.ename||''||cur.sal);
10endloop;
11*end;
SQL>/
输入no的值:
10
原值7:
l_deptno:
=&no;
新值7:
l_deptno:
=10;
CLARK1984.5
KING4050
MILLER1053
PL/SQL过程已成功完成。
SQL>/
输入no的值:
20
原值7:
l_deptno:
=&no;
新值7:
l_deptno:
=20;
SMITH800
JONES2975
SCOTT3000
ADAMS1100
FORD3000
PL/SQL过程已成功完成。
●Ref游标(引用游标referencecursor)
强引用游标:
(一般建议多用强引用游标,少用弱引用游标!
!
)
--可以显示各部门的员工信息:
1declare
2l_empt_emp%rowtype;
3typeref_cur_empisrefcursorreturnt_emp%rowtype;
4cur_empref_cur_emp;
5begin
6opencur_empforselect*fromt_empwheredeptno=&no;
7loop
8fetchcur_empintol_emp;
9exitwhencur_emp%notfound;
10dbms_output.put_line(l_emp.ename||''||
11l_emp.sal||''||
12l_emp.deptno);
13endloop;
14closecur_emp;
15*end;
SQL>/
输入no的值:
10
原值6:
opencur_empforselect*fromt_empwheredeptno=&no;
新值6:
opencur_empforselect*fromt_empwheredeptno=10;
CLARK245010
KING500010
MILLER130010
PL/SQL过程已成功完成。
SQL>/
输入no的值:
20
原值6:
opencur_empforselect*fromt_empwheredeptno=&no;
新值6:
opencur_empforselect*fromt_empwheredeptno=20;
SMITH80020
JONES297520
SCOTT300020
ADAMS110020
FORD300020
PL/SQL过程已成功完成。
*****************************************************************
弱引用游标:
1declare
2l_empt_emp%rowtype;
3typeref_cur_empisrefcursor;
4cur_empref_cur_emp;
5begin
6opencur_empforselect*fromt_empwheredeptno=&no;
7loop
8fetchcur_empintol_emp;
9exitwhencur_emp%notfound;
10dbms_output.put_line(l_emp.ename||''||
11l_emp.sal||''||
12l_emp.deptno);
13endloop;
14closecur_emp;
15*end;
SQL>/
输入no的值:
10
原值6:
opencur_empforselect*fromt_empwheredeptno=&no;
新值6:
opencur_empforselect*fromt_empwheredeptno=10;
CLARK245010
KING500010
MILLER130010
PL/SQL过程已成功完成。
SQL>/
输入no的值:
20
原值6:
opencur_empforselect*fromt_empwheredeptno=&no;
新值6:
opencur_empforselect*fromt_empwheredeptno=20;
SMITH80020
JONES297520
SCOTT300020
ADAMS110020
FORD300020
PL/SQL过程已成功完成。
****************************************************************
案例:
--查询员工各部门平均工资,最大工资,最小工资等等:
1declare
2typerec_static_empisrecord(
3deptnot_emp.deptno%type,
4sumsalnumber(8),
5avgsalnumber(10,4),
6maxsalt_emp.sal%type,
7minsalt_emp.sal%type,
8counternumber(3));
9l_statrec_static_emp;
10typeref_stat_empisrefcursorreturnrec_static_emp;
11cur_stat_empref_stat_emp;
12begin
13opencur_stat_empfor
14selectdeptno,sum(sal),avg(sal),max(sal),min(sal),count(*)
15fromt_emp
16groupbydeptno;
17loop
18fetchcur_stat_empintol_stat;
19exitwhencur_stat_emp%notfound;
20dbms_output.put_line(l_stat.deptno||''||
21l_stat.sumsal||''||
22l_stat.avgsal||''||
23l_stat.maxsal||''||
24l_stat.minsal||''||
25l_stat.counter);
26endloop;
27closecur_stat_emp;
28*end;
SQL>/
3094001566.666728509506
2010875217530008005
1070882362.5405010533
PL/SQL过程已成功完成。
综合案例:
--对大于2000的员工进行提薪10%,并将提薪的信息写入日志表:
1declare
2l_salt_emp.sal%type;
3l_ratenumber(4,2);
4l_oldsalt_emp.sal%type;
5l_empt_emp%rowtype;
6cursorcur_emp(v_salt_emp.sal%type)
7is
8select*fromt_empwheresal>v_sal;
9begin
10l_sal:
=&sal;
11l_rate:
=&rate;
12opencur_emp(l_sal);
13loop
14fetchcur_empintol_emp;
15l_oldsal:
=l_emp.sal;
16exitwhencur_emp%notfound;
17updatet_empsetsal=sal*l_ratewhereempno=l_emp.empno;
18insertintot_logvalues(seq_log.nextval,
19l_emp.empno||'oldsal='||l_oldsal||
20',newsal='||l_emp.sal*l_rate,sysdate);
21endloop;
22closecur_emp;
23commit;
24*end;
SQL>/
输入sal的值:
2000
原值10:
l_sal:
=&sal;
新值10:
l_sal:
=2000;
输入rate的值:
1.5
原值11:
l_rate:
=&rate;
新值11:
l_rate:
=1.5;
PL/SQL过程已成功完成。
SQL>select*fromt_log;
IDLOGINFOTIMER
--------------------------------------------------------------------------
17566oldsal=2975,newsal=297516-8月-13
27698oldsal=2850,newsal=285016-8月-13
37788oldsal=3000,newsal=300016-8月-13
47839oldsal=4050,newsal=405016-8月-13
57902oldsal=3000,newsal=300016-8月-13
67566oldsal=3272.5,newsal=3272.516-8月-13
77698oldsal=3135,newsal=313516-8月-13
87788oldsal=3300,newsal=330016-8月-13
97839oldsal=4455,newsal=445516-8月-13
107902oldsal=3300,newsal=330016-8月-13
117566oldsal=3599.75,newsal=3959.72516-8月-13
IDLOGINFOTIMER
--------------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游 标.docx