游 标.docx

上传人:b****8 文档编号:9886820 上传时间:2023-05-21 格式:DOCX 页数:17 大小:55.88KB
下载 相关 举报
游 标.docx_第1页
第1页 / 共17页
游 标.docx_第2页
第2页 / 共17页
游 标.docx_第3页
第3页 / 共17页
游 标.docx_第4页
第4页 / 共17页
游 标.docx_第5页
第5页 / 共17页
游 标.docx_第6页
第6页 / 共17页
游 标.docx_第7页
第7页 / 共17页
游 标.docx_第8页
第8页 / 共17页
游 标.docx_第9页
第9页 / 共17页
游 标.docx_第10页
第10页 / 共17页
游 标.docx_第11页
第11页 / 共17页
游 标.docx_第12页
第12页 / 共17页
游 标.docx_第13页
第13页 / 共17页
游 标.docx_第14页
第14页 / 共17页
游 标.docx_第15页
第15页 / 共17页
游 标.docx_第16页
第16页 / 共17页
游 标.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

游 标.docx

《游 标.docx》由会员分享,可在线阅读,更多相关《游 标.docx(17页珍藏版)》请在冰点文库上搜索。

游 标.docx

游标

游标

●隐式游标

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

--------------------------------------------------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 育儿理论经验

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2