一.PL/SQL函数创建语法:
CREATE [OR REPLACE] FUNCTION function_name (arg1 [IN|OUT|IN OUT] type1 [DEFAULT value1], arg2 [IN|OUT|IN OUT] type2 [DEFAULT value2]) RETURN data_type IS|AS --变量的声明部分 BEGIN --执行部分 --函数返回值表达式 RETURN expression; EXCEPTION --异常处理部分 END;二.对于参数的解释:
IN,OUT,IN OUT是形参模式。若默认不写的情况下,则为IN模式。
IN模式的形参,只能讲实参传递给形参,进入函数内部,只能读,不能写,同时,返回时实参的值不能改变。
OUT模式的形参,会忽略调用时实参的值,可以读,也可以写,返回时形参的值会赋值给形参。
IN OUT模式的形参,包括IN和OUT两种模式的特征。
实例:
默认或IN模式传参数;
--创建函数 CREATE OR REPLACE FUNCTION fun_test( v_id NUMBER)--参数 RETURN VARCHAR2--返回值类型 AS--变量定义 resultName mytest.name%TYPE; BEGIN -- SELECT NAME INTO resultName FROM mytest WHERE ID = v_id; --返回值 RETURN resultName; EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('没有找到数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('查询异常了'); END fun_test;--函数创建结束 -----调用函数 SELECT fun_test(1) FROM dual;
OUT模式传参数:
--创建函数 CREATE OR REPLACE FUNCTION fun_test( v_id IN NUMBER,v_age OUT NUMBER)--参数 RETURN VARCHAR2--返回值类型 AS--变量定义 resultName mytest.name%TYPE; BEGIN -- SELECT NAME,age INTO resultName,v_age FROM mytest WHERE ID = v_id; --返回值 RETURN resultName; EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('没有找到数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('查询异常了'); END fun_test;--函数创建结束特别注意,带有OUT模式的形参函数,不能在sql中直接调用,需要定义变量接受out输出值。
在命令窗口测试如下:
IN OUT模式传参数:
CREATE OR REPLACE FUNCTION fun_test( v_id IN NUMBER,v_age IN OUT NUMBER)--参数 RETURN VARCHAR2--返回值类型 AS--变量定义 resultName mytest.name%TYPE; BEGIN -- SELECT NAME,age INTO resultName,v_age FROM mytest WHERE ID = v_id; --返回值 RETURN resultName; EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('没有找到数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('查询异常了'); END fun_test;--函数创建结束命令窗口中执行:
三,函数调用方式
主要有三种,
第一种,位置表示法:
调用时按形参的排列顺序,依次写出实参的名称,而将形参与实参关联起来进行传递。
--创建函数 CREATE OR REPLACE FUNCTION fun_test( v_id IN NUMBER,v_age OUT NUMBER)--参数 RETURN VARCHAR2--返回值类型 AS--变量定义 resultName mytest.name%TYPE; BEGIN -- SELECT NAME,age INTO resultName,v_age FROM mytest WHERE ID = v_id; --返回值 RETURN resultName; EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('没有找到数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('查询异常了'); END fun_test;--函数创建结束调用:
DECLARE v_name mytest.name%TYPE; v_age mytest.age%TYPE; BEGIN --函数调用,位置表示法 v_name:=fun_test(1,v_age); DBMS_OUTPUT.PUT_LINE(v_name); DBMS_OUTPUT.PUT_LINE(v_age); END;
第二种,名称表示法:
在调用时按形参的名称与实参的名称,写出实参对应的形参,而将形参与实参关联起来进行传递。
DECLARE v_name mytest.name%TYPE; v_age mytest.age%TYPE; BEGIN --函数调用,名称表示法 v_name:=fun_test(v_age => v_age,v_id =>1);--函数形参名v_id对应1,v_age返回对应v_age变量 DBMS_OUTPUT.PUT_LINE(v_name); DBMS_OUTPUT.PUT_LINE(v_age); END;
第三种,组合传递法:
在调用一个函数时,同时使用位置表示法和名称表示法为函数传递参数。
DECLARE v_name mytest.name%TYPE; v_age mytest.age%TYPE; BEGIN --函数调用,组合传递法 v_name:=fun_test(1,v_age=>v_age); DBMS_OUTPUT.PUT_LINE(v_name); DBMS_OUTPUT.PUT_LINE(v_age); END;四,参数的默认值
函数创建时给参数设定默认值,当函数调用时,没有为该参数传值,使用默认值作为参数值,如果传入,则用传入的实参。
默认值只能用于IN模式的形参模式,即只能使用与输入,而输出或输入/输出都不能用默认值。
CREATE OR REPLACE FUNCTION fun_test( v_id IN NUMBER DEFAULT 1)--参数默认值为1 RETURN VARCHAR2--返回值类型 AS--变量定义 resultName mytest.name%TYPE; BEGIN -- SELECT NAME INTO resultName FROM mytest WHERE ID = v_id; --返回值 RETURN resultName; EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('没有找到数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('查询异常了'); END fun_test;--函数创建结束调用:
DECLARE v_name mytest.name%TYPE; BEGIN --函数调用,v_id默认值1 v_name:=fun_test();--函数不传入参数时,默认使用默认值 DBMS_OUTPUT.PUT_LINE(v_name); v_name:=fun_test(2);--函数传入参数时,使用传入的参数值 DBMS_OUTPUT.PUT_LINE(v_name); END;结果:
one
two