日期:2014-05-16 浏览次数:20566 次
create or replace procedure remove_from_emp(empno_in in employee.empno%type)
is
begin
delete from employee where empno = empno_in;
dbms_output.put_line('删除了' || sql%rowcount || '条记录!');
end;
/
-- 定义一个存储过程来调用存储过程remove_from_emp,并保存隐式游标的属性值
create or replace procedure show_emp_count is
i_count integer;
i_numfound pls_integer;
begin
select count(*) into i_count from employee;
-- 将属性值做一个快照
i_numfound := sql%rowcount;
-- 注意employee表中没有编号为99的员工
-- 调用存储过程remove_from_emp
remove_from_emp(1);
-- 现在可以用前一条语句的属性值输出
dbms_output.put_line(i_numfound);
end;
/
create or replace package types is type emp_cur5 is ref cursor; end; / declare -- 定义一个不带参数的游标emp_cur1,游标的结果是employee表中员工的集合 cursor emp_cur1 is select * from employee; -- 定义一个带参数的游标emp_cur2,游标的结果集是匹配由游标传递过来的员工编号的员工姓名和加入公司的时间 cursor emp_cur2 (empno_in in number) is select name,hiredate from employee where empno = empno_in; -- 定义一个带有return 子句的游标,游标的结果集是员工编号为1的employee表中所有的列 cursor emp_cur3 return employee%rowtype is select * from employee where empno = 1;
cursor emp_cur4 (empno_in in number) is select name,salary from employee where empno = empno_in for update; -- 应该总是将游标行提取到用%rowtype定义的记录中,这样更灵活(表字段改变了不需要更改fetch语句) emp_row1 employee%rowtype; -- 基于游标定义一个记录 emp_row2 emp_cur2%rowtype; emp_row3 emp_cur3%rowtype; emp_row4 emp_cur4%rowtype; n_salary number(10,2); n_empno employee.empno%type := &员工编号:; -- 游标变量和ref cursor -- 定义ref cursor 类型的游标变量 -- 创建一个强类型的引用游标类型 type emp_ref_type1 is ref cursor return employee%rowtype; -- 创建一个弱类型的引用游标类型(弱类型的游标变量比强类型的游标变量更灵活) type emp_ref_type2 is ref cursor; -- 定义实际的游标变量 emp_ref1 emp_ref_type1; emp_ref2 emp_ref_type2; -- 从Oracle9i 开始提供了一个名为sys_refcursor的预定义的Oracle系统游标, -- 它相当于弱类型游标,使用它不需要定义游标变量 sys_cursor sys_refcursor; -- 定义一个行类型的集合 type emp_table_type is table of employee%rowtype index by binary_integer; emp_table emp_table_type; type emp_info_type is record(name employee.name%type,job employee.job%type); emp_info emp_info_type; begin
open emp_cur1;
-- 提取记录
-- 如果游标只返回一行可以用if、loop或for来判断获得数据,如果游标返回多行可以用loop或for来循环获得数据
loop
fetch emp_cur1 into emp_row1;
exit when emp_cur1%notfound;
dbms_output.put_line('员工' || emp_row1.name || '的工资是:' || emp_row1.salary);
end loop;
-- 关闭游标并释放资源
close emp_cur1;
-- 打开带参数的游标
-- 游标for 循环能很好的简化游标的开发,我们不再需要声明记录,不再需要Open、Fetch和Close语句
-- 也不再需要%found属性检测记录,一切Oracle隐式的帮我们完成了
for emp_row2 in emp_cur2(n_empno) loop
dbms_output.put_line('员工' || emp_row2.name || '加入公司的时间是 ' || emp_row2.hiredate);
end loop;
-- 打开带return 子句的游标
open emp_cur3;
fetch emp_cur3 into emp_row3;
if emp_cur3%found then
dbms_output.put_line('员工' || emp_row3.name || '其职位是' || emp_row3.job || ',加入公司的时间是 ' || emp_row3.hiredate);
end if;
close emp_cur3;
-- 打开带for update 子句的游标,将指定编号的员工工资增加500元
open emp_cur4(n_empno);
fe