ORACLE存储函数

2015-11-21 01:56:49 · 作者: · 浏览: 4
前奏:
必要的概念:
    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;