|
第四章plsql 游标 |
|
|
游标(cursor...is)什么是游标游标是一个指向上下文的句柄或指针。通过游标,PL/SQL可以控制上下文区和处理语句时上下文区 会发生些什么事情,对于不同的SQL语句,游标的使用情况不同:SQL游标非查询语句隐式的结果是单行的查询语句隐式的或显示的结果是多行 的查询语句显示的处理显示游标:显示游标处理需四个PL/SQL步骤:定义游标:就是定义一个游标名,以及与其相对应的select语句。 注意:在指定数据类型时,不能使用长度约束,如number(4),char(10)等都是错误的。打开游标:就是执行游标所对应的sel ect语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。提取游标数据:就是检索结果集合中的数据行,放入指定 的输出变量中。关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源。并使该游标的工作区变成无效 ,不能再使用fetch语句取其中数据,关闭后的游标可以使用open语句重新打开。例:打印出80部门的所有的员工的工资:sala ry:xxx游标的while循环Declarev_salemployees.salary%type;--定义游标curso remp_sal_cursorisselectsalaryfromemployeeswheredepartment _id=80;Begin--打开游标openemp_sal_cursor;--提取游标fetchemp_sal_curs orintov_sal;--对游标进行循环操作:判断游标中是否有下一条记录whileemp_sal_cursor%fo undloopdbms_output.put_line(''salary''||v_sal);fetchemp_sal_cur sorintov_sal;endloop;--关闭游标Closeemp_sal_cursor;End;用记录类型来 写:打印出80部门的所有的员工的工资,id.declaretypeemp_recordisrecord(v_salem ployees.salary%type,v_empidemployees.employee_id%type);v_emp_rec ordemp_record;cursoremp_sal_cursorisselectsalary,employee_id fromemployeeswheredepartment_id=80;beginopenemp_sal_cursor;f etchemp_sal_cursorintov_emp_record;whileemp_sal_cursor%found loopdbms_output.put_line(''工资''||v_emp_record.v_sal||''员工号''||v_emp_ record.v_empid);fetchemp_sal_cursorintov_emp_record;endloop;c loseemp_sal_cursor;end;游标的for循环:自动执行游标的open,fetch,close语句和循环语句的功 能;当进入循环时,游标for循环句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数据而进入下一次循环时,游标for循 环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标。例:打印出80部门的所有的员工的 工资,id.declarecursoremp_cursorisselectsalary,employee_idfrom employeeswheredepartment_id=80;BeginForainemp_cursorloopd bms_output.put_line(''工资''||a.salary||''员工号''||a.employee_id);endloo p;end;利用游标while循环完成,调整employees表中员工的工资:工资范围调整基数0-500 05%5000-100003%10000-150002%15000-1%De clarecursoremp_cursorisselectsalary,employee_idfromemployee s;v_tempnumber(5,2);v_salemployees.salary%type;v_idemployees.e mployee_id%type;Beginopenemp_cursor;fetchemp_cursorintov_sal, v_id;whileemp_cursor%foundloopifv_sal<5000thenv_temp:=0.05;e lsifv_sal>5000andv_sal<10000thenv_temp:=0.03;elsifv_sal>100 00andv_sal<15000thenv_temp:=0.02;elsev_temp:=0.01;endif;up dateemployeessetsalary=salary+salaryv_tempwhereemployee_id=v _id;fetchemp_cursorintov_sal,v_id;dbms_output.put_line(v_sal| |'',''||v_id);endloop;closeemp_cursor;end;如何输出update前和后的信息???利用游标 for循环完成,调整employees表中员工的工资:工资范围调整基数0-50005% 5000-100003%10000-150002%15000-1%declarecurso remp_sal_cursorisselectsalary,employee_ididfromemployees; v_tempnumber(4,2);beginforcinemp_sal_cursorloopifc.sala ry<=5000thentemp:=0.05;elsifc.salary<=10000thentemp :=0.03;elsifc.salary<=15000thentemp:=0.02;elseemp:= 0.01;endif;--dbms_output.put_line(v_id||'':''||v_sal||'', ''||temp);updateemployeessetsalary=salary(1+temp)whe reemployee_id=c.id;endloop;end;隐式游标:更新1005号员工salary(涨工资100 ),如果该员工没有找到,则打印”查无此人”信息beginupdateemployeessetsalary=salary+100whereemployee_id=1005;ifsql%notfoundthendbms_output.put_line(''查无此人!'');endif;end; |
|
|
|
|
|
|
|
|
|
|