示例如下:
v_in_dept_id NUMBER,
v_out_emp_count OUT NUMBER)
RETURN NUMBER
IS
v_sum NUMBER;
BEGIN
SELECT SUM(salary), count(*) INTO v_sum, v_out_emp_count
FROM employees WHERE deptno=v_in_dept_id;
RETURN v_sum;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Dept id '||v_in_dept_id||' not found');
END get_salary_by_dept;
向函数中传递参数有三种方法:
-
示例如下:
第二种参数传递的方法是名称表示法,即显式地指定参数名和传入值,不必按照参数定义的顺序,语法是:
argument1 => parameter1 [, argument2 => parameter2[, …]]
obclient> DECLARE
-> V_num NUMBER;
-> V_sum NUMBER;
-> BEGIN
-> V_sum :=get_salary_by_dept(v_out_emp_count => V_num, v_in_dept_id => 30 );
-> DBMS_OUTPUT.PUT_LINE('Total salary: '||v_sum);
-> DBMS_OUTPUT.PUT_LINE('Total amount of person: '||V_num);
-> END;
-> /
Query OK, 0 rows affected (0.06 sec)
Total salary: 24900
Total amount of person: 6
第三种方法为混合表示法,即同时使用位置表示法和名称表示法为函数传递参数。采用这种参数传递方法时,使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面。也就是说,无论函数具有多少个参数,只要其中有一个参数使用名称表示法,其后所有的参数都必须使用名称表示法。
示例如下:
参数默认值
CREATE OR REPLACE FUNCTION demo_def_args(
name VARCHAR2,
age INTEGER,
-- 如果gender不传入值,则默认为male
gender VARCHAR2 DEFAULT 'Male')
RETURN VARCHAR2
AS
V_var VARCHAR2(32);
BEGIN
V_var := name||', '||gender||', '||TO_CHAR(age)||' years old.';
具有默认值的函数创建后,在函数调用时,如果没有为具有默认值的参数提供实际参数值,函数将使用该参数的默认值。但当调用者为默认参数提供实际参数时,函数将使用实际参数值。在创建函数时,只能为输入参数设置默认值,而不能为输入/输出参数设置默认值。