前奏:
必要的概念:
    ORACLE  提供能够把 PL/SQL  程序存储在数据库中。并能够在不论什么地方来运行它。这样就叫存储过
    程或函数。
    过程和函数统称为 PL/SQL 子程序。他们是被命名的 PL/SQL 块,均存储在数据库中,并
    通过输入、输出參数或输入/输出參数与其调用者交换信息。过程和函数的唯一差别是函数总向调
    用者返回数据。而过程则不返回数据。

1:创建函数 CREATE [OR REPLACE] FUNCTION function_name [ (argment [ { IN | IN OUT }] Type, argment [ { IN | OUT | IN OUT } ] Type ] [ AUTHID DEFINER | CURRENT_USER ] RETURN return_type { IS | AS } <类型.变量的说明> BEGIN FUNCTION_body EXCEPTION 其他语句 END; 2:说明: 1) OR REPLACE 为可选. 有了它, 能够或者创建一个新函数或者替换同样名字的函数, 而不会出现冲突 2) 函数名后面是一个可选的參数列表, 当中包括 IN, OUT 或 IN OUT 标记. 參数之间用逗号隔开. IN 參数标记表示传递给函数的值在该函数运行中不改变OUT 标记表示一个值在函数中进行计算并通过该參数传递给调用语句; IN OUT 标记表示传递给函数的值能够变化并传递给调用语句. 若省略标记, 则參数隐含为 IN。 3) 由于函数须要返回一个值, 所以 RETURN 包括返回结果的数据类型. 3:例题: --存储函数结构 create function func_name(dept_id number , salary number) return number is --函数使用过程中 须要声明的变量 记录类型 cursor begin --函数的运行体 exception --处理函数运行过程中异常 end; --例题1 写一个返回hellow world的function create or replace function hello_func(temp varchar2) return varchar2 is begin return 'hello world'|| temp; end; --调用函数: begin dbms_output.put_line(hello_func); end; select hello_func('cui') from dual; --例二 写一个返回系统时间的函数 假设函数没有形參 切勿加() create function get_sysdate return date is v_date date; begin v_date := sysdate; return v_date; end; select get_sysdate() from dual; --创建两个參数相加的 存储函数 create function add_func(temp_A number , temp_B number) return number is temp_sum number(10); begin temp_sum := temp_A + temp_B; return temp_sum; end; select add_func(1,1) from dual; --定义一个函数:获取给定部门的工资总和。要求:部门号定义为參数,工资总额定义为返回值; create function get_sal(dept_id number) return number is v_sumsal number(10):=0; cursor salary_cursor is select salary from employees where department_id = dept_id; begin for c in salary_cursor loop v_sumsal := v_sumsal + c.salary; end loop; return v_sumsal; end; select get_sal(60) from dual; --定义一个函数 获取指定部门的工资总和 和 该部门的员工总数(定义为out类型的參数) --要求部门号定义为參数,工资总额定义为返回值 create function get_sall(dept_id number , total_count out number) return number is v_sumsal number(10):=0; cursor salary_cursor is select salary from employees where department_id = dept_id; begin total_count := 0; for c in salary_cursor loop v_sumsal := v_sumsal + c.salary; total_count := total_count + 1; end loop; return v_sumsal; end; 4:函数的调用 declare v_num number(5):=0; begin dbms_output.put_line(get_sall(60,v_num)); dbms_output.put_line(v_num); end;


posted on 2017-08-20 18:56  yutingliuyl  阅读(660)  评论(0编辑  收藏  举报