Oracle基础学习(二) 存储过程和函数

--创建函数语法
create [or replace] function [schema.]function_name
(函数参数列表) --参数有IN、OUT、IN OUT三种类型;IN代表需要输入的参数,OUT代表要返回的参数,IN OUT代表即是输入参数也是返回参数。
return datetype--返回类型               
-- out参数:查询某个员工姓名、月薪和职位 -- 原则: 如果只有一个返回值,用存储函数;否则,就用存储过程。
[is | as ]---任选一个,后面跟pLSQL代码块 [declare]--有参数时使用关键字 begin --执行的SQL end; --实例

1.

根据输入参数的部门内码获得部门名称

CREATE OR REPLACE FUNCTION f_get_name(i_empno IN VARCHAR2)
RETURN VARCHAR2 IS
v_emp_name emp.ename%TYPE;
BEGIN
SELECT t.ename INTO v_emp_name
FROM emp t WHERE t.empno = i_empno;
RETURN(v_emp_name);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('你需要的数据不存在');
WHEN OTHERS THEN
dbms_output.put_line('发生其他错误');
END f_get_name;

2.
create
or replace function avg_pric(v_total in number(10.2), v_num In OUT number(10,2)) return number(10,2) as v_pric number(10,2); begin v_pric:=v_total/v_num; return v_pric; end; --查看函数 select * from User_Procedures;--用户拥有的触发器、存储过程、函数查询表 select * from User_Source;--查询用户拥有触发器、存储过程、函数的源码。 select * from dba_Procedures;--系统表 select * from dba_Source;--系统表

3.--查询某个员工的年收入
create or replace function queryemp_income(eno in number)
return number
as 
    --定义变量接收薪水和奖金
    p_sal emp.sal%type;
    p_comm emp.comm%type;
begin
  select sal,comm into p_sal,p_comm from emp where empno=eno;
  --nvl为遇空函数,如果p_comm为空则返回0
  return nvl(p_comm,0)+p_sal*12;
end;

 存储过程

CREATE [OR REPLACE] PROCEDURE procedure_name
    [ (parameter [,parameter]) ]
IS
    [declaration_section]
BEGIN
    executable_section
[EXCEPTION
    exception_section]
END [procedure_name];
复制代码

调用存储过程方式一,exec 存储过程名

调用存储过程方式二,PLSQL程序

1.无参数存储过程
create or replace procedure pro_no_par is begin update employees set salary=salary+100 where employee_id=100; commit; dbms_output.put_line('工资已经调整!!'); end pro_no_par; --执行,使用execute execute pro_no_par;

2.in传入参数存储过程

create or replace procedure pro_no_par
is

  begin
  update employees set salary=salary+100 where employee_id=100;
  commit;
  dbms_output.put_line('工资已经调整!!');
  end pro_no_par;
  --执行,使用execute
  execute pro_no_par;

 3. out参数 

  declare
  ex_var_1 number;
  ex_var_2 employees.first_name%type;
  ex_var_3 employees.phone_number%type;
  begin
   ex_var_1:=102;
  pro_out_par(ex_var_1,ex_var_2,ex_var_3);
  dbms_output.put_line('员工号为'||ex_var_1||'的员工姓名是;'||ex_var_2||',联系电话是:'||ex_var_3);
  end;

其中参数IN表示输入参数,是参数的默认模式。

OUT表示返回值参数,类型可以使用任意Oracle中的合法类型

  

-- out参数:查询某个员工姓名、月薪和职位
-- 原则: 如果只有一个返回值,用存储函数;否则,就用存储过程。
create or replace procedure queryempinfor(eno in number,pename out varchar2,
  psal out number,pjob out varchar2)
as 
begin
   -- 得到该员工的姓名、月薪和职位
    select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;
/
--将人员表中经理职位并且年薪大于7万的人员信息插入到MANAGER表中,输出参数是插入的条数

create or replace procedure p_manager_update(o_ename_num out number) is
begin
select to_number(count(1)) into o_ename_num
from emp e
where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000
and e.job='MANAGER';
insert into MANAGER(INCODE,ENAME,CREATE_DATE)
select deptno_seq.nextval,e.ename,sysdate
from emp e
where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000
and e.job='MANAGER'; 
commit;
end p_manager_update;

--在COMMONAD WINDOWS里执行

exec p_manager_update;
 

 

--显示cursor的处理
declare 
---声明cursor,创建和命名一个sql工作区
cursor cursor_name is 
    select real_name from account_hcz;
    v_realname varchar2(20);
begin
    open cursor_name;---打开cursor,执行sql语句产生的结果集
    fetch cursor_name into v_realname;--提取cursor,提取结果集中的记录
    dbms_output.put_line(v_realname);
    close cursor_name;--关闭cursor
end;

 

 

 

posted @ 2018-06-21 16:13  东篱下  阅读(188)  评论(0编辑  收藏  举报