快捷搜索:

ORACLE PL/SQL编程之把过程与函数说透

历程与函数(别的还有包与触发器)是命名的PL/SQL块(也是用户的规划工具),被编译后存储在数据库中,以备履行。是以,其它PL/SQL块可以按名称来应用他们。以是,可以将商业逻辑、企业规则写成函数或历程保存到数据库中,以便共享。

历程和函数统称为PL/SQL子法度榜样,他们是被命名的PL/SQL块,均存储在数据库中,并经由过程输入、输出参数或输入/输出参数与其调用者互换信息。历程和函数的独一差别是函数总向调用者返回数据,而历程则不返回数据。在本节中,主要先容:

1、创建存储历程和函数。

2、精确应用系统级的非常处置惩罚和用户定义的非常处置惩罚。

3、建立和治理存储历程和函数。

创建函数

1. 创建函数

语法如下:

CREATE [OR REPLACE] FUNCTION function_name

(arg1 [ { IN | OUT | IN OUT }] type1

[DEFAULT value1],

[arg2 [ { IN | OUT | IN OUT }] type2 [DEFAULT value1]],

......

[argn [ { IN | OUT | IN OUT }] typen [DEFAULT valuen]])

[ AUTHID DEFINER | CURRENT_USER ]RETURN return_type

IS | AS

BEGIN

履行部分

RETURN expressionEXCEPTION

非常处置惩罚部分END function_name;

IN,OUT,IN OUT是形参的模式。若省略,则为IN模式。IN模式的形参只能将实参通报给形参,进入函数内部,但只能读不能写,函数返回时实参的值不变。OUT模式的形参会轻忽调用时的实参值(或说该形参的初始值老是NULL),但在函数内部可以被读或写,函数返回时形参的值会付与给实参。IN OUT具有前两种模式的特点,即调用时,实参的值老是通报给形参,停止时,形参的值通报给实参。调用时,对付IN模式的实参可所以常量或变量,但对付OUT和IN OUT模式的实参必须是变量。

一样平常,只有在确认function_name函数是新函数或是要更新的函数时,才应用OR REPALCE关键字,否则轻易删除有用的函数。

例1、获取某部门的人为总和:

--获取某部门的人为总和

CREATE OR REPLACEFUNCTION get_salary(

Dept_no NUMBER,

Emp_count OUT NUMBER)

RETURN NUMBER ISV_sum NUMBER;BEGINSELECT SUM(SALARY), count(*) INTO V_sum, emp_count

FROM EMPLOYEES WHERE DEPARTMENT_ID=dept_no;

RETURN v_sum;EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('你必要的数据不存在!');

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);END get_salary;

2. 函数的调用

函数声明时所定义的参数称为形式参数,利用法度榜样调用时为函数通报的参数称为实际参数。利用法度榜样在调用函数时,可以应用以下三种措施向函数通报参数:

第一种参数通报款式:位置表示法。

即在调用时按形参的排列顺序,依次写出实参的名称,而将形介入实参关联起来进行通报。用这种措施进行调用,形介入实参的名称是互相自力,没有关系,强调序次才是紧张的。

款式为:argument_value1[,argument_value2 …]

例2:谋略某部门的人为总和:

DECLAREV_num NUMBER;

V_sum NUMBER;BEGIN

V_sum :=get_salary(10, v_num);

DBMS_OUTPUT.PUT_LINE('部门号为:10的人为总和:'||v_sum||',人数为:'||v_num);END;

第二种参数通报款式:名称表示法。

即在调用时按形参的名称与实参的名称,写出实参对应的形参,而将形介入实参关联起来进行通报。这种措施,形介入实参的名称是互相自力的,没有关系,名称的对应关系才是最紧张的,序次并不紧张。

款式为: argument => parameter [,…]

此中:argument 为形式参数,它必须与函数定义时所声明的形式参数名称相同parameter 为实际参数。

在这种款式中,形势参数与实际参数成对呈现,互相间关系独一确定,以是参数的顺序可以随意率性排列。

例3:谋略某部门的人为总和:

DECLAREV_num NUMBER;

V_sum NUMBER;BEGIN

V_sum :=get_salary(emp_count => v_num, dept_no => 10);

DBMS_OUTPUT.PUT_LINE('部门号为:10的人为总和:'||v_sum||',人数为:'||v_num);END;

第三种参数通报款式:组合通报。

即在调用一个函数时,同时应用位置表示法和名称表示法为函数通报参数。采纳这种参数通报措施时,应用位置表示法所通报的参数必须放在名称表示法所通报的参数前面。也便是说,无论函数具有若干个参数,只要此中有一个参数应用名称表示法,其后所有的参数都必须应用名称表示法。

例4:

CREATE OR REPLACE FUNCTION demo_fun(

Name VARCHAR2,--留意VARCHAR2不能给精度,如:VARCHAR2(10),其它类似

Age INTEGER,

Sex VARCHAR2)

RETURN VARCHAR2 AS

V_var VARCHAR2(32);BEGIN

V_var := name||':'||TO_CHAR(age)||'岁.'||sex;RETURN v_var;END;DECLARE

Var VARCHAR(32);BEGINVar := demo_fun('user1', 30, sex => '男');

DBMS_OUTPUT.PUT_LINE(var);Var := demo_fun('user2', age => 40, sex => '男');

DBMS_OUTPUT.PUT_LINE(var);Var := demo_fun('user3', sex => '女', age => 20);

DBMS_OUTPUT.PUT_LINE(var);END;

无论采纳哪一种参数通报措施,实际参数和形式参数之间的数据通报只有两种措施:传址法和传值法。所谓传址法是指在调用函数时,将实际参数的地址指针通报给形式参数,使形式参数和实际参数指向内存中的同一区域,从而实现参数数据的通报。这种措施又称作参照法,即形式参数参照实际参数数据。输入参数均采纳传址法通报数据。

传值法是指将实际参数的数据拷贝到形式参数,而不是通报实际参数的地址。默认时,输出参数和输入/输出参数均采纳传值法。在函数调用时,ORACLE将实际参数数据拷贝到输入/输出参数,而当函数正常运行退出时,又将输出形式参数和输入/输出形式参数数据拷贝到实际参数变量中。

3. 参数默认值

在CREATE OR REPLACE FUNCTION 语句中声明函数参数时可以应用DEFAULT关键字为输入参数指定默认值。

例5:

CREATE OR REPLACE FUNCTION demo_fun(Name VARCHAR2,

Age INTEGER,

Sex VARCHAR2 DEFAULT '男')

RETURN VARCHAR2 AS

V_var VARCHAR2(32);BEGIN

V_var := name||':'||TO_CHAR(age)||'岁.'||sex;

RETURN v_var;END;

具有默认值的函数创建后,在函数调用时,假如没有为具有默认值的参数供给实际参数值,函数将应用该参数的默认值。但当调用者为默认参数供给实际参数时,函数将应用实际参数值。在创建函数时,只能为输入参数设置默认值,而不能为输入/输出参数设置默认值。

DECLARE var VARCHAR(32);BEGIN Var := demo_fun('user1', 30);

DBMS_OUTPUT.PUT_LINE(var); Var := demo_fun('user2', age => 40);

DBMS_OUTPUT.PUT_LINE(var); Var := demo_fun('user3', sex => '女',

age => 20); DBMS_OUTPUT.PUT_LINE(var);END;

您可能还会对下面的文章感兴趣: