PL/SQL之函数处理

一.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输出值。

在命令窗口测试如下:

PL/SQL之函数处理_第1张图片

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;--函数创建结束
命令窗口中执行:

PL/SQL之函数处理_第2张图片

三,函数调用方式

主要有三种,

第一种,位置表示法:

调用时按形参的排列顺序,依次写出实参的名称,而将形参与实参关联起来进行传递。

--创建函数
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

你可能感兴趣的:(function,函数调用,函数创建,参数模式)