oracle中函数,游标的使用

来源:互联网 发布:域名便宜 编辑:程序博客网 时间:2024/05/16 14:47

oracle中函数和游标的使用

--创建函数并且调用create function fun1(v_in_ename varchar2)return number isv_annual_sal number;begin  select (sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=v_in_ename;  return v_annual_sal;end;/--直接调用函数var v_annual_sal number;call fun1('FORD') into:v_annual_sal;print v_annual_sal;--包--需求:编写一个包,该包有一个过程,该过程可以接收用户名和新的薪水--(将来用于通过用户名去更新薪水)还有一个函数,该函数可以接收一个用户名--(将来要实现得到该用户的年薪是多少)create package mypackage1 is--声明一个过程procedure pro1(v_in_ename varchar2,v_in_newsal number);function fun1(v_in_ename varchar2) return number;end;--编写包体create package body mypackage1 is--具体实现过程procedure pro1(v_in_ename varchar2,v_in_newsal number) isbegin  update emp set sal=v_in_newsal where ename=v_in_ename;end;function fun1(v_in_ename varchar2) return number is  v_annual_sal number;begin  select (sal+nvl(comm,0))*13 into v_annual_sal from emp   where ename=v_in_ename;  return v_annual_sal;end;end;/  --pl/sql详细语法create or replace procedure pro1(v_in_empno number) is--定义变量v_tax_rate number :=0.03;v_sal number;v_tax number;v_ename varchar2(32);beginselect ename,sal into v_ename,v_sal from empwhere empno=v_in_empno;v_tax:=v_sal*v_tax_rate;dbms_output.put_line(v_ename||'工资是='||v_sal||'个人所得税='||v_tax);end;--pl/sql中使用%type 来提高列的灵活性create or replace procedure pro1(v_in_empno number) is--定义变量v_tax_rate number :=0.03;v_sal emp.sal%type;v_tax number;v_ename emp.ename%type;beginselect ename,sal into v_ename,v_sal from empwhere empno=v_in_empno;v_tax:=v_sal*v_tax_rate;dbms_output.put_line(v_ename||'工资是='||v_sal||'个人所得税='||v_tax);end;--【案例】编写一个过程,该过程可以接收一个用户编号,--并显示该用户的名字,薪水,工作岗位(注意:使用pl/sql记录实现)create or replace procedure pro1(v_in_empno in number) is--定义记录数据类型type zy_emp_record is record(v_ename emp.ename%type,v_sal emp.sal%type,v_job emp.job%type);--定义一个变量,类型是zy_emp_recordv_emp_record zy_emp_record;beginselect ename,sal,job into v_emp_recordfrom emp where empno=v_in_empno;dbms_output.put_line('用户名:'||v_emp_record.v_ename||'薪水='||v_emp_record.v_sal);end;--游标的使用create or replace procedure pro1(v_in_deptno number) is--先定义一个游标变量类型type zy_emp_cursor is ref cursor;--定义一个游标变量v_emp_cursor zy_emp_cursor;--定义2个变量v_ename emp.ename%type;v_sal emp.sal%type;begin--执行语句open v_emp_cursor for select ename,sal from emp where deptno=v_in_deptno;--取出游标指向的每行数据,用循环语句loopfetch v_emp_cursor into v_ename,v_sal; --这句话执行后会引起v_emp_cursor向下走--判断当前游标是否到达最后exit when v_emp_cursor%notfound;--输出dbms_output.put_line('用户名='||v_ename||' 薪水='||v_sal);end loop;--关闭游标close v_emp_cursor;end;--游标的使用,在上面的基础上添加工资create or replace procedure pro1(v_in_deptno number) is--先定义一个游标变量类型type zy_emp_cursor is ref cursor;--定义一个游标变量v_emp_cursor zy_emp_cursor;--定义2个变量v_ename emp.ename%type;v_sal emp.sal%type;v_empno emp.empno%type;begin--执行语句open v_emp_cursor for select ename,sal,empno from emp where deptno=v_in_deptno;--取出游标指向的每行数据,用循环语句loopfetch v_emp_cursor into v_ename,v_sal,v_empno; --这句话执行后会引起v_emp_cursor向下走--判断当前游标是否到达最后exit when v_emp_cursor%notfound;--输出dbms_output.put_line('用户名='||v_ename||' 薪水='||v_sal);if v_sal <2000 then  update emp set sal=sal+1000 where empno=v_empno;end if;end loop;--关闭游标close v_emp_cursor;end;


原创粉丝点击